2013-02-17 19 views
6

私は、ログファイルを提供するためにbottle.pyでgevent-websocketを使用しています。 WebSocket接続がクライアント側からクローズされたことを検出するにはどうすればよいですか?Gevent-Websocketクローズド接続の検出

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

しかし、私は、クライアントがWebSocketの接続を閉じた場合は、正しく、サーバー上で検出したい:私は壊れたパイプのエラーを取得するまで、私は書いている時点では

。私のコードまたは溶液への任意の他の改善は歓迎されている

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

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コード:

私のコードは次のようになります。

答えて

7

if ws.socket is not None:のテストを試してから、ソケットにデータを送信してください。

+3

許諾よりも許してほしいと思う方がいいです。まだ競争状態があります。 – warvariuc

関連する問題