server.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. import logging
  8. async def echo(connection: socket, loop: AbstractEventLoop) -> None:
  9. try:
  10. while data := await loop.sock_recv(connection, 1024):
  11. if data == b'q':
  12. raise Exception('Неожиданая ошибка сети')
  13. await loop.sock_sendall(connection, data)
  14. except Exception as ex:
  15. logging.exception(ex)
  16. finally:
  17. connection.close()
  18. async def listen_for_connections(server_socket: socket, loop: AbstractEventLoop):
  19. while True:
  20. connection, address = await loop.sock_accept(server_socket)
  21. connection.setblocking(False)
  22. print(f'Получен запрос на подключение от {address}')
  23. asyncio.create_task(echo(connection, loop))
  24. async def main():
  25. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  26. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  27. server_address = ('127.0.0.1', 8000)
  28. server_socket.setblocking(False)
  29. server_socket.bind(server_address)
  30. server_socket.listen()
  31. await listen_for_connections(server_socket, asyncio.get_event_loop())
  32. # asyncio.run(main())
  33. def foo():
  34. selector = selectors.DefaultSelector()
  35. server_socket = socket.socket()
  36. server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  37. server_address = ('127.0.0.1', 8000)
  38. server_socket.setblocking(False)
  39. server_socket.bind(server_address)
  40. server_socket.listen()
  41. selector.register(server_socket, selectors.EVENT_READ)
  42. while True:
  43. events: List[Tuple[SelectorKey, int]] = selector.select(timeout=1)
  44. if len(events) == 0:
  45. print('Событий нет, подожду еще!')
  46. for event, _ in events:
  47. event_socket = event.fileobj
  48. if event_socket == server_socket:
  49. connection, address = server_socket.accept()
  50. connection.setblocking(False)
  51. print(f'Получен запрос на подключение от {address}')
  52. selector.register(connection, selectors.EVENT_READ)
  53. else:
  54. data = event_socket.recv(1024)
  55. print(f"Получены данные: {data}")
  56. event_socket.send(data)
  57. if __name__ == '__main__':
  58. asyncio.run(main())