使用烧瓶socketio经常断开套接字连接

Posted

技术标签:

【中文标题】使用烧瓶socketio经常断开套接字连接【英文标题】:Socket connection breaking frequently with flask-socketio 【发布时间】:2018-09-18 16:44:51 【问题描述】:

我正在使用flask-socketio 建立从我的python Web 服务器到javascript 客户端的套接字连接。我能够建立连接,但它会在一段时间内(5 秒左右)中断并出现错误

socket.io.min.js:2 WebSocket 连接到 'ws://localhost:5000/socket.io/?EIO=3&transport=websocket&sid=8ed663e14c6f47328b64f2d29a30d1cd' 失败:收到包含无效 UTF-8 的损坏关闭帧。

发送消息的服务器端代码(定期调用,比如每 5 秒一次)

def send_message(result):
    # it will forward the message to all clients.
    print("sending message")
    socketio.send("Send working",  json=False)

接收消息的客户端代码

socket.on('message', function (data) 
    console.log('message form backend ' + data);
);

它以某种方式中断->然后一段时间内没有任何反应->然后再次自动连接->然后再次中断。

有人可以帮忙吗?非常感谢!

【问题讨论】:

多浏览器会出现这种情况吗?您是否尝试过其他计算机? 您是否使用 socketio = SocketIO(app, ping_timeout=#) 之类的方法更改了 ping 超时值?我相信当我将 ping_timeout 更改为 10 秒时遇到了这个确切的问题,但没有更改 ping_interval,默认情况下为 25 秒。如果这是您的问题,将 ping_interval 更改为小于超时应该可以解决它 - 它似乎对我来说。 我试过了,但没有成功。 你的socketio对象指的是什么? 正如@Tal 指出的,当我修复超时/间隔数字时,我没有收到错误...但这只会防止连接被中断,但不能解释为什么我会得到无效的 UTF -8 关闭框架中的内容?当前端用户打开打印弹出窗口并且它保持打开的时间比我的超时时间长时,我得到了同样的错误,因为当打印弹出窗口打开时,浏览器停止向后端发送请求,所以 socketio 服务器认为用户走了,我得到了那个错误...... 【参考方案1】:

我修好了。

socketio = SocketIO(app,ping_timeout=5)

ping_timeout – 客户端在断开连接之前等待服务器响应的时间(以秒为单位)。 所以如果你什么都不做,它会在 5 秒后断开连接。

解决办法是: 让您的客户端在超时之前向服务器发送消息。

因为我的服务器通常发送数据,所以我让我的客户端像:

socket.on('message', function (data) 
    console.log('message form backend ' + data);
    socket.send('data receive!');
);

【讨论】:

以上是关于使用烧瓶socketio经常断开套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

SocketIO + Flask 检测断开连接

socket io:如何传递参数来断开套接字事件?

如何在烧瓶socketio中保持活力?

烧瓶 socketio CORS

socket.io、netty-socketio、nginx 每分钟断开连接

如何访问使用 websockets 发送的烧瓶中的 formData?Flask-SocketIO