Закрыть сокет, заблокированный потребителем
У меня есть открытый сокет в бесконечном цикле, прослушивающий XMPP-сервер для получения информации о присутствии пользователей. При получении новой информации она отправляется потребителю для обновления списка пользователей в режиме реального времени. Вот код для моего сокета:
# get consumer channel layer
channel_layer = get_channel_layer()
# define socket
s: socket.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock: ssl.SSLSocket = ssl.wrap_socket(s, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_TLSv1_2)
# connect to XMPP Server
sock.connect((hostname, port))
# send request
sock.sendall("<presence/>".encode())
while True:
# receive presence
presence = sock.recv(4096)
async_to_sync(channel_layer.group_send)("presence_channel", {"type": "presence", "text": presence})
sock.close()
А это код моего потребителя:
class PresenceConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
self.name = "presence_channel"
# join channel
await self.channel_layer.group_add(self.name, self.channel_name)
await self.accept()
async def disconnect(self, close_code):
# leave channel
await self.channel_layer.group_discard(self.name, self.channel_name)
# receive message from channel
async def presence(self, event):
# Send message to WebSocket
await self.send_json(event)
Я хотел бы знать, как я могу остановить сокет, когда я отсоединяюсь от потребителя (например, потому что пользователь обновляет страницу или закрывает приложение). Я пробовал использовать флаги управления или глобальные переменные, но сокет застревает на recv()
. Я также не хочу устанавливать таймаут, потому что я хотел бы продолжать получать информацию до тех пор, пока пользователь остается подключенным.