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