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