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))
Код: Выделить всё
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.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