2013-02-17 5 views
6

Я использую gevent-websocket с bottle.py для обслуживания журнальных файлов. Как я могу обнаружить, что соединение с websocket закрыто с клиентской стороны?Gevent-Websocket Обнаружение закрытого соединения

На данный момент я просто пишу, пока я не сломана ошибку трубы:

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

Но я хотел бы, чтобы правильно определить на сервере, если клиент закрыл соединение WebSocket.

Мой код выглядит следующим образом:

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() 

и соответствующий клиент 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() 
     }; 
}); 

Любые другие улучшения в мой код или решения приветствуются.

ответ

7

Пробуйте тестирование на if ws.socket is not None: перед отправкой данных на розетку.

+3

Лучше попросить прощения, чем для разрешения. Там все еще есть состояние гонки. – warvariuc