Я пытаюсь создать простой веб-сервер с 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
1733203644
Anonymous
Я пытаюсь создать простой веб-сервер с 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.
Подробнее здесь: [url]https://stackoverflow.com/questions/79246355/websocket-with-python-error-winerror-121-the-semaphore-timeout-period-has-exp[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия