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

问题描述 投票:0回答:1

我在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)之前,我应该知道服务器的状态(运行/停止)。这样我就可以阻止我的数据包丢失了

python-3.x websocket twisted autobahn
1个回答
0
投票

我假设您通过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()
© www.soinside.com 2019 - 2024. All rights reserved.