我正在使用websocket-client连接到websocket服务器。我连接的服务器似乎期待我定期ping它,否则它会断开我的连接。
当我连接到服务器时,它会向我发送以下消息:
0{"sid":"SomeID","upgrades":[],"pingInterval":25000,"pingTimeout":60000}
这似乎告诉我ping间隔和ping超时。我注意到我的websocket客户端连接后持续断开~1分25秒。如果你把这些数字加起来60s + 25s你会得到1分25秒。所以我似乎需要经常ping这个服务器所以它不会断开我。
如何ping服务器?我试过ws.ping()但似乎并不存在。我是否需要以某种预期的格式将数据发送到服务器?或者是否有一些内置的ping命令?
websocket.enableTrace(True)
ws = websocket.WebSocketApp("wss://socket.serverssite.com/socket.io/?transport=websocket",
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.run_forever()
注意:我在节点(而不是python)中创建了一个websocket客户端,它在1分25秒后没有关闭。所以似乎有一些内置的ping这个python websocket客户端不...
------------------------编辑------------------- ------
尝试设置ping_interval和ping_timeout,但它仍在关闭:
2017-11-06 12:49:14.340037 ---------------------做东西
2017-11-06 12:49:14.340309 ---------------------做东西
发送:'\ x89 \ x80 \\ xd9 \ xc4 \ xdd'
2017-11-06 12:49:19.341680 ---------------------做东西
2017-11-06 12:49:19.341958 ---------------------做东西
发送:'\ x89 \ x80 \ xd9 \ x06 \ xef \ xa8'
2017-11-06 12:49:24.343426 ---------------------做东西
2017-11-06 12:49:24.343769 ---------------------做东西
发送:“\ x89 \ x80 \ xe6 \ x92'\ xb8”
发送:'\ x88 \ x823 \ xfb $ \ xd10 \ x13'
关闭(这是调用封闭方法的地方,服务器关闭我)
答案 0 :(得分:1)
来自源代码 -
def run_forever(self, sockopt=None, sslopt=None,
ping_interval=0, ping_timeout=None,
http_proxy_host=None, http_proxy_port=None,
http_no_proxy=None, http_proxy_auth=None,
skip_utf8_validation=False,
host=None, origin=None)
指定ping_interval
应该适合您。
ws.run_forever(ping_interval=70, ping_timeout=10)
答案 1 :(得分:1)
我遇到了类似的问题并通过ping服务器来解决它。我使用的是asyncio和websockets库,并使用以下内容来阻止websocket关闭:
await ws.send('2')
使用标准的websocket库将是类似的。
服务器是socket.io这意味着您需要在pingTimeout中向服务器发送2的ping消息。 From socket.io:
编码 - 数据包
编码数据包可以是UTF-8字符串或二进制数据。包裹 字符串的编码格式如下
...
0 open打开新传输时从服务器发送(重新检查)
1关闭请求关闭此传输但不关闭 连接本身。
2 ping 由客户发送。服务器应该使用包含的pong包来回答 相同的数据
...
超时
客户端必须使用pingTimeout和pingInterval作为部分发送 握手(用开包)确定是否 服务器没有响应。
客户端发送ping数据包。如果pingTimeout中没有收到数据包类型,则客户端认为套接字已断开连接。如果是pong 实际收到数据包后,客户端将等待pingInterval 再次发送ping包。
由于服务器和客户端之间共享两个值,因此 服务器也将能够检测客户端是否成为 在pingTimeout +中没有收到任何数据时无响应 pingInterval。