Есть ли какой-либо способ определить, действительно ли sendMessage() WebSocketClientProtocol доставляет сообщение на сервер или нет?

Я использую «библиотеку автобана с скрученным» в 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)' я должен каким-то образом узнать статус сервера (работает/остановлен). Чтобы я мог остановить потерю пакетов данных

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
209
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что вы используете свой 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()

Здорово! В таком случае, можете ли вы нажать кнопку «Принять» в этом ответе?

Jean-Paul Calderone 10.04.2019 15:15

Другие вопросы по теме