Сценарии асинхронного сервера и клиента перестали работать после обновления до Python3.12.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сценарии асинхронного сервера и клиента перестали работать после обновления до Python3.12.

Сообщение Anonymous »

Итак, у меня есть два сценария, которые используют серверы asyncio для связи: работа сценария заключается в том, что сервер открывает сервер asyncio и прослушивает соединения, клиентский сценарий подключается к этому серверу, серверный сценарий прекращает прослушивание новых соединений и назначает чтение и запись в глобальные переменные, чтобы можно было отправлять и получать данные.
Server.py:

Код: Выделить всё

import asyncio
import sys

class Server:
def __init__(self):
self.reader, self.writer = None, None
self.connected = False

async def listen(self, ip: str, port: int) -> None:
"""
Listens for incoming connections and handles the first connection.
After accepting the first connection, it stops the server from accepting further connections.

:param ip: IP address to listen on.
:param port: Port number to listen on.
"""

async def handle_connection(reader, writer):
print("Client connected!")
# Assign the reader and writer to instance variables for later use
self.reader, self.writer = reader, writer
self.connected = True

print("Shutting down server from accepting new connections")
server.close()
await server.wait_closed()

print(f"Listening on {ip}:{port}")
server = await asyncio.start_server(handle_connection, ip, port)

try:
async with server:
await server.serve_forever()

except KeyboardInterrupt:
sys.exit(1)

except asyncio.CancelledError:
print("Connection canceled")
except Exception as e:
print(f"Unexpected error while trying to listen, Error: {e}")
sys.exit(1)

if __name__ == '__main__':
server = Server()
asyncio.run(server.listen('192.168.0.35', 9090))
Client.py:

Код: Выделить всё

import asyncio

class Client:
def __init__(self):
self.reader, self.writer = None, None
self.connected = False

async def connect(self, ip: str, port: int) -> None:
"""
Connects to a server at the specified IP address and port.

:param ip: IP address of the server.
:param port: Port number of the server.
"""

while not self.connected:
try:
self.reader, self.writer = await asyncio.wait_for(
asyncio.open_connection(ip, port), 5
)
print(f"Connecting to {ip}:{port}")
self.connected = True
break
except Exception as e:
print(
f"Failed to connect to {ip}:{port} retrying in 10 seconds."
)
print(e)
await asyncio.sleep(10)
continue

if __name__ == '__main__':
Client = Client()
asyncio.run(Client.connect('192.168.0.35', 9090))
В Python 3.11 процесс выполнения был следующим: клиентский сценарий подключается к прослушивающему серверному сценарию, серверный сценарий вызывает функцию handle_connection, а функция вызывает asyncio.CancelledError, который завершает метод прослушивания и поддерживает работу чтения и записи.
Однако в Python 3.12; клиентский сценарий подключается к прослушивающему серверному сценарию, серверный сценарий вызывает handle_connection и зависает в await server.wait_closed().
Я провел некоторую отладку и обнаружил, что строка await server.wait_closed() не возвращает если средство записи не закрыто с помощью write.close(), чего нам не нужно, потому что, как я уже сказал, сценарий будет использовать устройства чтения и записи для связи.
Мое намеренное действие заключалось в том, чтобы серверный сценарий прослушивал одно соединение, а когда соединение установлено, чтобы он прекратил прослушивание любого дальнейшего попытки подключения, но при этом поддерживают соединение между ним и исходным подключенным клиентом.
РЕДАКТИРОВАТЬ: я обновился с python3.11.9 до python3.12.6

Подробнее здесь: https://stackoverflow.com/questions/790 ... python3-12
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»