import selectors from selectors import SelectorKey from typing import List, Tuple import socket import asyncio from asyncio import AbstractEventLoop async def echo(connection: socket, loop: AbstractEventLoop) -> None: while data := await loop.sock_recv(connection, 1024): await loop.sock_sendall(connection, data) async def listen_for_connections(server_socket: socket, loop: AbstractEventLoop): while True: connection, address = await loop.sock_accept(server_socket) connection.setblocking(False) print(f'Получен запрос на подключение от {address}') asyncio.create_task(echo(connection, loop)) def foo(): selector = selectors.DefaultSelector() server_socket = socket.socket() server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_address = ('127.0.0.1', 8000) server_socket.setblocking(False) server_socket.bind(server_address) server_socket.listen() selector.register(server_socket, selectors.EVENT_READ) while True: events: List[Tuple[SelectorKey, int]] = selector.select(timeout=1) if len(events) == 0: print('Событий нет, подожду еще!') for event, _ in events: event_socket = event.fileobj if event_socket == server_socket: connection, address = server_socket.accept() connection.setblocking(False) print(f'Получен запрос на подключение от {address}') selector.register(connection, selectors.EVENT_READ) else: data = event_socket.recv(1024) print(f"Получены данные: {data}") event_socket.send(data) async def main(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_address = ('127.0.0.1', 8000) server_socket.setblocking(False) server_socket.bind(server_address) server_socket.listen() await listen_for_connections(server_socket, asyncio.get_event_loop()) asyncio.run(main()) if __name__ == '__main__': main()