server.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import selectors
  2. from selectors import SelectorKey
  3. from typing import List, Tuple
  4. import socket
  5. import asyncio
  6. from asyncio import AbstractEventLoop
  7. async def echo(connection: socket, loop: AbstractEventLoop) -> None:
  8. while data := await loop.sock_recv(connection, 1024):
  9. await loop.sock_sendall(connection, data)
  10. async def listen_for_connections(server_socket: socket, loop: AbstractEventLoop):
  11. while True:
  12. connection, address = await loop.sock_accept(server_socket)
  13. connection.setblocking(False)
  14. print(f'Получен запрос на подключение от {address}')
  15. asyncio.create_task(echo(connection, loop))
  16. def foo():
  17. selector = selectors.DefaultSelector()
  18. server_socket = socket.socket()
  19. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  20. server_address = ('127.0.0.1', 8000)
  21. server_socket.setblocking(False)
  22. server_socket.bind(server_address)
  23. server_socket.listen()
  24. selector.register(server_socket, selectors.EVENT_READ)
  25. while True:
  26. events: List[Tuple[SelectorKey, int]] = selector.select(timeout=1)
  27. if len(events) == 0:
  28. print('Событий нет, подожду еще!')
  29. for event, _ in events:
  30. event_socket = event.fileobj
  31. if event_socket == server_socket:
  32. connection, address = server_socket.accept()
  33. connection.setblocking(False)
  34. print(f'Получен запрос на подключение от {address}')
  35. selector.register(connection, selectors.EVENT_READ)
  36. else:
  37. data = event_socket.recv(1024)
  38. print(f"Получены данные: {data}")
  39. event_socket.send(data)
  40. async def main():
  41. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  42. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  43. server_address = ('127.0.0.1', 8000)
  44. server_socket.setblocking(False)
  45. server_socket.bind(server_address)
  46. server_socket.listen()
  47. await listen_for_connections(server_socket, asyncio.get_event_loop())
  48. asyncio.run(main())
  49. if __name__ == '__main__':
  50. main()