我花了大約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」值來完成的。
在目前我只是廣播心跳所有,這是我不喜歡的個人