是否有任何方法可以检测 WebSocketClientProtocol 的 sendMessage() 是否实际向服务器传递消息?

Is there any method to detect sendMessage() of WebSocketClientProtocol actually delivers message to server or not?

我在 python 中使用 "autobahn library with twisted" 创建网络套接字服务器和客户端。有一种情况是我的服务器可能宕机了,但是客户端使用 'sendMessage()' 不断地向服务器发送一些数据包。在这种情况下,我遇到数据包丢失。有什么办法可以让我知道我的数据包是在服务器端正确接收还是无法到达服务器?

我已经实现了 WebSocketClientProtocol 提供的 onClose() 方法,这只是让我了解网络套接字连接丢失的情况。但这并不能解决我的问题。因为我的代码中的 hello() 是 运行 每 1 秒发送一次数据包到服务器,而不管服务器是否是 运行。

# this method is provide by WebSocketClientProtocol class, automatically triggers wen connection is established. According to my requirement hello() method should be continuously running and notify me wen there is no server to listen
def onOpen(self):
        print("WebSocket connection open.")
        def hello():
            b = bytearray([0x11, 0x01, 0x00, 0x01, 0x00])
            self.sendMessage(bytes(b), isBinary=True)
            self.factory.reactor.callLater(1, hello)

        # start sending messages every second ..
        hello()

当Web socket服务器为运行时,它应该接收来自客户端的字节数据包。但是万一它挂了,在调用 'self.sendMessage(bytes(b), isBinary=True)' 之前,我应该以某种方式想知道服务器的状态(running/stopped)。这样我就可以阻止我的数据包丢失

我假设您是 运行 通过 TCP 连接的 WebSocket。

TCP 保证消息传递或连接丢失通知。总的来说,有一些棘手的极端情况必须考虑(例如,也许您的消息已发送,然后连接丢失,然后您等待响应;在这种情况下,连接丢失通知的保证是不同的) .但是,在您的情况下,您每秒发送一条消息,保证非常简单。如果连接丢失,那么在最坏的情况下,您发送的下一条消息将启动一个短计时器,最终导致您的应用程序收到连接丢失的通知。

Autobahn 通过 onClose 协议方法向您公开此类通知。

所以:

class YourWebSocketClientProtocol(...):
    def onOpen(self):
        print("WebSocket connection open.")
        self.still_connected = True
        def hello():
            if self.still_connected:
                b = bytearray([0x11, 0x01, 0x00, 0x01, 0x00])
                self.sendMessage(bytes(b), isBinary=True)
                self.factory.reactor.callLater(1, hello)

        # start sending messages every second ..
        hello()        

    def onClose(self, ...):
        self.still_connected = False

或者,更简单一些:

from twisted.internet.task import LoopingCall

class YourWebSocketClientProtocol(...):
    def onOpen(self):
        print("WebSocket connection open.")
        def hello():
            b = bytearray([0x11, 0x01, 0x00, 0x01, 0x00])
            self.sendMessage(bytes(b), isBinary=True)
            self.factory.reactor.callLater(1, hello)

        # start sending messages every second ..
        self._hello = LoopingCall(hello)
        d = self._hello.start(1.0)
        d.addErrback(... handle problems ...)


    def onClose(self, ...):
        self._hello.stop()