Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时

Posted

技术标签:

【中文标题】Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时【英文标题】:Socket.io with flask-socketio python. How to set socket keepalive/timeout 【发布时间】:2015-01-25 08:58:38 【问题描述】:

我正在努力寻找有关 socket.io 超时值的任何文档。我在客户端使用 //cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js 在服务器端使用 Flask-SocketIO。

这是我创建套接字的方式:

namespace = '/coregrapher'

var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);

socket.on('connect', function() 
    socket.emit('my event', data: 'I\'m connected!');
);

socket.on('my response', function(msg) 
    $('#result').append(msg.data);
);

问题是,如果服务器甚至一分钟都没有向客户端或visaversa 发送任何内容,客户端就会断开连接,如果服务器尝试向客户端发出另一次发送,它会失败,因为客户端已经断开连接。如何让客户端保持连接?

谢谢!

【问题讨论】:

socket.io 具有基于常规保活数据包的自动重新连接逻辑。如果服务器停止响应keep-alives,连接将被丢弃,客户端将尝试重新连接。有很多参数可以控制重新连接逻辑,以确定它尝试重新连接的时间和强度,但基本上,如果您的服务器长时间停机,套接字就会停机。这里真正的问题是弄清楚为什么你的服务器没有响应,因为它应该始终响应socket.io 连接才能可靠。 要检查的另一件事是确保连接的两端相互兼容,因为我认为 socket.io 在从 v0.9 到 v1.0 时会更改协议,所以如果你'正在使用 0.9,您必须确保您的 Flask-SocketIO 使用的是该版本的协议(或自动调整)。 当我在服务器端进行编程并将发送消息发送到浏览器中的日志输出时,它旨在延迟连接。但是有些过程比其他过程花费的时间更长,我需要确保它不会断开连接。如何做到这一点? 您是说您正在处理的服务器可能长时间忙碌,因此无法及时响应保持活动的数据包? 所以具体来说,我正在调试,并在我处理它时设置了一个断点,然后当我想继续代码时,套接字已经断开,有没有办法可以防止这种情况?跨度> 【参考方案1】:

总体问题是,如果您的服务器在一段时间内对保持活动数据包没有响应,客户端将断开连接并尝试重新连接。如果它无法重新连接,最终它将停止尝试。

也就是说,如果您想修改重试逻辑的配置,那么您可以将选项对象作为第二个参数发送给您的.connect() 调用。根据文档here,可以控制以下选项:

选项:

reconnection 是否自动重连(true) reconnectionDelay 在尝试新的重新连接之前等待多长时间 (1000) reconnectionDelayMax 重新连接之间等待的最长时间 (5000)。每次尝试都会增加重新连接 reconnectionDelay 指定的数量。 在发出 connect_error 和 connect_timeout 事件之前超时连接超时 (20000)

因此,如果您希望它在更长的时间内继续尝试自动重新连接,您可以增加最后三个选项的次数。

【讨论】:

【参考方案2】:

你也可以使用 Flask-SocketIO 在服务端设置参数:

socketio = SocketIO(ping_timeout=10, ping_interval=5)

:param ping_timeout: The time in seconds that the client waits for the
                     server to respond before disconnecting. The default is
                     60 seconds.
:param ping_interval: The interval in seconds at which the client pings
                      the server. The default is 25 seconds.

【讨论】:

以上是关于Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时的主要内容,如果未能解决你的问题,请参考以下文章

从android与socket.io通信

一次与两个用户随机聊天(Socket.io)

socket.io 服务器能否与非 socket.io 客户端通信

将 pm2 的集群模块与 socket.io 和 socket.io-redis 一起使用

RxJS.fromWebSocket 与 Socket.io

GraphQL 订阅与 socket.io