これを無駄にする方法を探すのに約5時間を費やしました。
チェリーピーの上に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,
}
この「ルートマップ」のどこかにパラメータを指定する必要があると思います。誰もこれを行う方法を知っていますか。
明確にするために、サーバーが各ピアのハートビートを作成するようにします。これは、「heartbeat_freq」値を渡すことによって行われると思います。
現在、私は個人的に好きではないハートビートを全員にブロードキャストしています。