Есть ли способ обнаружить sendMessage () WebSocketClientProtocol на самом деле доставляет сообщение на сервер или нет? - PullRequest
0 голосов
/ 09 апреля 2019

Я использую «библиотеку автобанов с витой» в Python для создания сервера веб-сокета и клиента.Есть ситуация, когда мой сервер может быть недоступен, но клиент постоянно отправляет некоторые пакеты данных на сервер, используя 'sendMessage ()'.В этом случае я испытываю потерю пакета данных.Есть ли способ, чтобы я мог узнать, правильно ли принят мой пакет данных на стороне сервера или он не достигает сервера?

Я реализовал метод onClose (), предоставляемый WebSocketClientProtocol, это просто дает мне представление о том, что соединение с веб-сокетом потеряно.Но это не решает мою проблему.Потому что мой 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()

Когда сервер веб-сокетов работает, он должен получать байты пакетов данных от клиента.Но в случае, если он не работает, перед вызовом «self.sendMessage (bytes (b), isBinary = True)» я должен каким-то образом узнать состояние сервера (запущен / остановлен).Так что я могу остановить потерю пакета данных

1 Ответ

0 голосов
/ 09 апреля 2019

Я полагаю, вы используете WebSocket через TCP-соединение.

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()
...