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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有任何方法可以检测WebSocketClientProtocol的sendMessage()实际上是否向服务器发送消息?相关的知识,希望对你有一定的参考价值。

我在python中使用“带有扭曲的高速公路库”来创建Web套接字服务器和客户端。有可能我的服务器出现故障,但客户端正在使用'sendMessage()'不断向服务器发送一些数据包。在这种情况下,我遇到数据包丢失。有什么方法可以让我知道我的数据包是在服务器端正确接收还是无法到达服务器?

我已经实现了WebSocketClientProtocol提供的onClose()方法,这只是给了我一个想法,即web连接丢失了。但它并没有解决我的问题。因为代码中的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套接字服务器运行时,它应该从客户端接收数据包的字节。但是如果它失败了,在调用'self.sendMessage(bytes(b),isBinary = True)之前,我应该知道服务器的状态(运行/停止)。这样我就可以阻止我的数据包丢失了

答案

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

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

高速公路通过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()

以上是关于是否有任何方法可以检测WebSocketClientProtocol的sendMessage()实际上是否向服务器发送消息?的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何功能可以检测站点域已更改?

如何检测是不是有任何进程阻止 Windows 进入睡眠状态?

是否有检测 X-Frame-Options 的客户端方法?

是否有任何公共 api 来检测可用的 AirPlay

是否可以检测 iPhone 上的非 MFI 配件?

是否有任何免费的 GeoIP 服务可以准确检测 2 个地址是否在 6Km 内?