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.
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