0

これを無駄にする方法を探すのに約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」値を渡すことによって行われると思います。

現在、私は個人的に好きではないハートビートを全員にブロードキャストしています。

4

1 に答える 1