2013-02-17 37 views
6

Tôi đang sử dụng gevent-websocket với bottle.py để phục vụ các tệp nhật ký. Làm cách nào để phát hiện thấy kết nối websocket bị đóng từ phía máy khách?Gevent-Websocket Phát hiện kết nối đã đóng

Tại thời điểm tôi chỉ viết cho đến khi tôi nhận được một lỗi đường ống bị hỏng:

return sock.send(data, flags) 
error: [Errno 32] Broken pipe 

Nhưng tôi muốn đúng cách phát hiện trên máy chủ nếu khách hàng đóng kết nối WebSocket.

Mã của tôi trông giống như:

from geventwebsocket.handler import WebSocketHandler 
from gevent.pywsgi import WSGIServer 
import gevent.monkey 
gevent.monkey.patch_all() 
from bottle import route, Bottle, view, request, static_file 
import json 
import os 
import time 

app = Bottle() 

# Other code 

@app.route('/websocket/<filename>') 
def ws_logfile(filename): 
    if request.environ.get('wsgi.websocket'): 
     ws = request.environ['wsgi.websocket'] 
     try: 
      filename = os.path.join(os.getcwd(), "logfiles", filename) 
      logfile = file(filename) 
      lines = logfile.readlines() 
      for line in lines: 
       ws.send(json.dumps({'output': line})) 

      while True: 
       line = logfile.readline() 
       if line: 
        # Here detect if connection is closed 
        # form client then break out of the while loop 
        ws.send(json.dumps({'output': line})) 
       else: 
        time.sleep(1) 
      ws.close() 

     except geventwebsocket.WebSocketError, ex: 
      print "connection closed" 
      print '%s: %s' % (ex.__class__.__name__, ex) 

if __name__ == '__main__': 
    http_server = WSGIServer(('127.0.0.1', 8000), app, handler_class=WebSocketHandler) 
    http_server.serve_forever() 

và khách hàng tương ứng mã javascript:

jQuery(document).ready(function(){ 
     ws = $.gracefulWebSocket("ws://" + document.location.host + "/websocket" + document.location.pathname); 

     ws.onmessage = function (msg) { 
     var message = JSON.parse(msg.data); 
     $("#log").append(message.output + "<br>"); 
     }; 

     window.onbeforeunload = function() { 
     ws.onclose = function() {console.log('unlodad')}; 
     ws.close() 
     }; 
}); 

Bất kỳ cải tiến khác để mã hoặc giải pháp của tôi được hoan nghênh.

Trả lời

7

Thử kiểm tra if ws.socket is not None: trước khi gửi dữ liệu ra trên ổ cắm.

+3

Tốt hơn để yêu cầu sự tha thứ hơn cho phép. Vẫn còn một điều kiện chủng tộc. – warvariuc

Các vấn đề liên quan