如何ping websocket服务器,所以它不会因为空闲而断开我

时间:2017-11-05 07:56:05

标签: python websocket

我正在使用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'

关闭(这是调用封闭方法的地方,服务器关闭我)

2 个答案:

答案 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。