gpt4 book ai didi

python - Gevent-Websocket 检测关闭连接

转载 作者:太空狗 更新时间:2023-10-29 23:55:09 38 4
gpt4 key购买 nike

我正在使用带有 bottle.py 的 gevent-websocket 来提供日志文件。我如何从客户端检测到 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()
};
});

欢迎对我的代码或解决方案进行任何其他改进。

最佳答案

尝试测试 if ws.socket is not None: 在套接字上发送数据之前。

关于python - Gevent-Websocket 检测关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14925413/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com