SHARE
TWEET

Untitled

a guest Jun 26th, 2019 58 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -*- coding: utf-8 -*-
  2. import asyncio
  3.  
  4. clients = []
  5.  
  6. class SimpleChatClientProtocol(asyncio.Protocol):
  7.     def connection_made(self, transport):
  8.         self.transport = transport
  9.         self.peername = transport.get_extra_info("peername")
  10.         print('Подключился: {}'.format(self.peername))
  11.         clients.append(self)
  12.  
  13.     def data_received(self, data):
  14.         print('{} отправил: {}'.format(self.peername, data.decode()))
  15.         for client in clients:
  16.             if client is not self:
  17.                 client.transport.write(data)
  18.  
  19.     def connection_lost(self, ex):
  20.         print('Отключился: {}'.format(self.peername))
  21.         clients.remove(self)
  22.  
  23.  
  24. # Цикл событий невозможно прервать, если в нём
  25. # не происходят события. Чтобы избежать этого
  26. # регистрируем в цикле фунцию, которая будет
  27. # вызываться раз в секунду.
  28. def wakeup():
  29.     loop = asyncio.get_event_loop()
  30.     loop.call_later(1, wakeup)
  31.  
  32.  
  33. if __name__ == '__main__':
  34.     print('Запуск...')
  35.  
  36.     # Получаем цикл событий
  37.     loop = asyncio.get_event_loop()
  38.     # Регистрируем "отлипатель"
  39.     loop.call_later(1, wakeup)
  40.     # Создаём асинхронную сопрограмму-протокол
  41.     coro = loop.create_server(SimpleChatClientProtocol, host='localhost', port=1080)
  42.     # Регистрируем её в цикле событий на выполнение
  43.     server = loop.run_until_complete(coro)
  44.  
  45.     for socket in server.sockets:
  46.         print('Сервер запущен на {}'.format(socket.getsockname()))
  47.     print('Выход по Ctrl+C\n')
  48.  
  49.     try:
  50.         loop.run_forever() # Запускаем бесконечный цикл событий
  51.     except KeyboardInterrupt: # Программа прервана нажатием Ctrl+C
  52.         pass
  53.     finally:
  54.         server.close() # Закрываем протокол
  55.         loop.run_until_complete(server.wait_closed()) # Асинхронно ожидаем окончания закрытия
  56.     loop.close() # Закрываем цикл событий
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top