Я пытаюсь создать простой веб-сервер с Python, который принимает соединения и присваивает каждому соединению идентификатор. Затем я могу отправить сообщение каждому клиенту, учитывая его идентификатор. Проблема заключается в том, что клиент отключается ненормально без надлежащего отключения (из-за сетевой ошибки на стороне клиента). Затем я получаю сообщение об ошибке OS: [WinError 121] Срок ожидания семафора истек.
Пожалуйста, найдите код ниже:
import asyncio
import websockets
import uuid
clients = {}
def generate_client_id():
return str(uuid.uuid4()) # Generates a random unique identifier
async def register(websocket):
client_id = generate_client_id()
clients[client_id] = websocket
print(f"Client {client_id} connected.")
return client_id
async def unregister(client_id):
if client_id in clients:
del clients[client_id]
print(f"Client {client_id} disconnected.")
async def send_message_to_client(client_id, message):
websocket = clients.get(client_id)
if websocket:
try:
await websocket.send(message)
except websockets.exceptions.ConnectionClosed as e:
print(f"Error: Failed to send message to {client_id} - connection closed: {e}")
await unregister(client_id)
except Exception as e:
print(f"Unexpected error with {client_id}: {e}")
await unregister(client_id)
else:
print(f"Client {client_id} not connected.")
async def handle_connection(websocket, path):
try:
client_id = await register(websocket)
try:
while True:
message = await websocket.recv()
print(f"Received message from {client_id}: {message}")
except websockets.exceptions.ConnectionClosed as e:
print(f"Client {client_id} connection closed: {e}")
except Exception as e:
print(f"Unexpected error with client {client_id}: {e}")
finally:
await unregister(client_id)
except Exception as e:
print(f"Error registering client: {e}")
async def main():
server = await websockets.serve(handle_connection, "0.0.0.0", 8765)
print("Server running on ws://0.0.0.0:8765")
await server.wait_closed()
# Run the server
asyncio.run(main())
Я пытался добавить разные исключения, чтобы отловить ошибку, но безуспешно. Это повторяется снова.
Журнал приложения можно найти ниже:
Server running on ws://0.0.0.0:8765
Client e529c3bf-121f-4408-aa6b-ac17774dbe94 connected.
data transfer failed Traceback (most recent call last):
...
OSError: [WinError 121] The semaphore timeout period has expired
Client e529c3bf-121f-4408-aa6b-ac17774dbe94 connection closed.
Client e529c3bf-121f-4408-aa6b-ac17774dbe94 disconnected.
Подробнее здесь: https://stackoverflow.com/questions/792 ... od-has-exp
Веб-сокет с ошибкой Python: [WinError 121] Срок ожидания семафора истек ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Веб-сокет с ошибкой Python: [WinError 121] Срок ожидания семафора истек
Anonymous » » в форуме Python - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Python: создание реентерабельного семафора (объединение RLock и семафора)
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-