Ошибка [WinError 121] появляется, когда клиент подключается к серверу, а затем ненормально отключается из-за потери сетевого подключения. Чтобы проверить это, я намеренно попытался соединить клиента с сервером WebSocket, а затем, пока соединение было открыто, отключил сеть клиента. Затем появилась ошибка.
Вот как можно воспроизвести ошибку:
[*]Скопируйте код сервера и вставьте его в py-файл и запустите.
[*]Получите любой клиентский метод. Я использовал Postman с другого компьютера (не с того же хоста, на котором работает сервер). Вы также можете использовать клиентские приложения WebSocket на своем смартфоне.
[*]Убедитесь, что компьютер, на котором работает сервер, и клиент, находятся в одной сети.
< li>Определите IP-адрес сервера.
[*]Подключите клиент к серверу.
[*]Отключите сеть клиента, оставив соединение открытым. (Выключив Wi-Fi, отсоединив кабель Ethernet и т. д.)
[*]Подождите около 30 секунд, и вы увидите появление указанной ошибки.
Код сервера указан ниже:
Код: Выделить всё
#!/usr/bin/env python
"""Echo server using the asyncio API."""
import asyncio
from websockets.asyncio.server import serve
async def echo(websocket):
async for message in websocket:
await websocket.send(message)
async def main():
async with serve(echo, "0.0.0.0", 8765) as server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())
Я думаю, так и должно быть. что-то с asyncio.
Чтобы лучше понять причину ошибки, я предоставляю полную неразрезанную трассировку стека.
Пожалуйста, найдите журнал приложение ниже:
Код: Выделить всё
connection handler failed
Traceback (most recent call last):
File "C:\Users\Jusuf Rrustaj\AppData\Local\Programs\Python\Python312\Lib\asyncio\proactor_events.py",
line 286, in _loop_reading
length = fut.result()
^^^^^^^^^^^^
File "C:\Users\Jusuf Rrustaj\AppData\Local\Programs\Python\Python312\Lib\asyncio\windows_events.py", line 803, in _poll
value = callback(transferred, key, ov)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Jusuf Rrustaj\AppData\Local\Programs\Python\Python312\Lib\asyncio\windows_events.py", line 462, in finish_socket_func
return ov.getresult()
^^^^^^^^^^^^^^
OSError: [WinError 121] The semaphore timeout period has expired
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\Jusuf Rrustaj\AppData\Local\Programs\Python\Python312\Lib\site-packages\websockets\asyncio\server.py", line 374, in conn_handler
await self.handler(connection)
File "e:\Programming\asyncio websocket\server.py", line 10, in echo
async for message in websocket:
File "C:\Users\Jusuf Rrustaj\AppData\Local\Programs\Python\Python312\Lib\site-packages\websockets\asyncio\connection.py", line 224, in __aiter__
yield await self.recv()
^^^^^^^^^^^^^^^^^
File "C:\Users\Jusuf Rrustaj\AppData\Local\Programs\Python\Python312\Lib\site-packages\websockets\asyncio\connection.py", line 279, in recv
raise self.protocol.close_exc from self.recv_exc
websockets.exceptions.ConnectionClosedError: no close frame received or sent
Иметь фрагмент кода, который идентифицирует, что клиент потерял соединение, и не выбрасывать ошибки.
Подробнее здесь: https://stackoverflow.com/questions/792 ... od-has-exp