我花了大约 5 个小时寻找如何做到这一点无济于事。
我们在cherrypy之上使用ws4py。目前,当连接物理丢失时(例如您关闭 WiFi),连接不会终止,直到从服务器发送一条消息,此时它会检测到掉线并清理套接字。
这给我们带来了问题,我们需要尽快知道套接字是否消失了。
ws4py 中的文件“websocket.py”有一个名为“Heartbeat”的类,它看起来正是我想要的,我相信如果它有一个“heartbeat_freq”参数传入,则在“WebSocket”内部创建一个实例;
class WebSocket(object):
""" Represents a websocket endpoint and provides a high level interface to drive the endpoint. """
def __init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=None):
上面是 ws4py ctor,但我找不到调用此代码的位置。我所知道的是它绑定在 CherryPy 回调系统中。这是我发现的;
上面的ctor是从函数中的“cherrypyserver.py”调用的;
def upgrade(self, protocols=None, extensions=None, version=WS_VERSION, handler_cls=WebSocket, heartbeat_freq=None):
这个函数似乎是一个回调,因为它是从函数中的 _cprequest.py 调用的
def __call__(self):
"""Run self.callback(**self.kwargs)."""
return self.callback(**self.kwargs)
现在有更多的东西漂浮在周围,但老实说,我有点迷茫,并认为我做错了。
据我所知,我需要设置回调的“heartbeat_freq”参数,但不确定在哪里设置这个参数。下面的代码是我指定回调创建其实例的“WebSocket”处理程序类(websocket2.Handler 继承自“WebSocket”)的地方。
rootmap2={
'wsgi.pipeline': [
('validator1', validator),
('validator2', validator),
] ,
'tools.websocket.on': True,
'tools.websocket.handler_cls': websocket2.Handler,
}
我相信在这个“rootmap”的某个地方我必须指定参数。有人知道怎么做这个吗。
澄清一下,我希望我的服务器为每个对等方创建一个心跳。我相信这是通过传入“heartbeat_freq”值来完成的。
目前我只是在向所有人广播心跳,我个人不喜欢这种声音