2013-06-24 41 views
0

我花了大约5个小时寻找如何做到这一点无济于事。使用ws4py插槽创建CherryPy心跳

我们在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”值来完成的。

在目前我只是广播心跳所有,这是我不喜欢的个人

回答

0

声音心跳才会被激活时,WebSocket的对象有执行(通常在一个线程作为它的阻止)它的run方法。然而,CherryPy插件由于各种原因不再使用该代码路径。我还没有决定怎么处理心跳,因为现在,它必须在每个websocket的自己的线程中运行。我发现昂贵的记忆方式。但是,如果您确实需要该功能,请使用websocket实例创建Heartbeat类的实例。只需持有对每个Heartbeat实例的参考。