| 
					
				 | 
			
			
				@@ -1,5 +1,69 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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_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() 
			 |