使用ws4py套接字心跳创建CherryPy



我花了大约5个小时寻找如何做到这一点,但都无济于事。

我们在cherrypy上使用ws4py。目前,当连接物理丢失时(比如你关闭了WiFi),连接不会终止,直到服务器发送消息,这时它会检测到掉线并清理插座。

这给我们带来了问题,我们需要尽快知道插座是否不见了。

ws4py中的文件"websocket.py"有一个名为"Heartbeat"的类,它看起来正是我想要的,并且我相信如果"websocket"中传入了"hearteat_freq"参数,则会在该实例中创建一个实例;

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)

现在有更多的东西漂浮在周围,但老实说,我有点迷失了方向,我认为我做错了。

根据我的理解,我需要设置回调的"hearteat_freq"参数,但不确定我将在哪里设置这个参数。下面的代码是我指定回调创建实例的"WebSocket"处理程序类(websocket2.handler继承自"WebSockett")的地方。

rootmap2={
    'wsgi.pipeline': [
        ('validator1', validator),
        ('validator2', validator),
        ]   ,   
        'tools.websocket.on': True,
        'tools.websocket.handler_cls': websocket2.Handler,
    }

我相信,在这个"根映射"的某个地方,我必须指定参数。有人知道怎么做吗。

为了澄清,我希望我的服务器为每个对等点创建一个心跳。我相信这是通过传递一个"hearteat_freq"值来完成的。

目前我只是向所有人广播心跳,我不喜欢个人的声音

只有当websocket对象执行其run方法时(通常在线程中,因为它正在阻塞),心跳才会被激活。然而CherryPy插件由于各种原因不再使用该代码路径。我还没有决定如何处理心跳,因为按照目前的情况,它必须在每个websocket自己的线程中运行。我觉得这种昂贵的记忆是明智的。但是,如果您确实需要该功能,请使用websocket实例创建Heartbeat类的实例。只需保存对每个心跳实例的引用。

相关内容

  • 没有找到相关文章

最新更新