Guest User

Untitled

a guest
Mar 22nd, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1. import socket
  2. import json
  3. import time
  4. import select
  5. from shared_utils import parser, send_message, get_message
  6.  
  7. IP, PORT = parser()
  8.  
  9. class Server:
  10. # Инициализируем входные данные и создаем серверный сокет
  11. def __init__(self):
  12. self.server_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0) # TCP
  13. self.server_sock.bind((IP, PORT))
  14. self.server_sock.listen(5)
  15. self.server_sock.settimeout(0.2)
  16.  
  17.  
  18. def connection(self):
  19. self.sock, addr = server.server_sock.accept()
  20. return self.sock
  21.  
  22. def read_requests(self, r_clients, all_clients):
  23. """
  24. Чтение сообщений, которые будут посылать клиенты
  25. :param r_clients: клиенты которые могут отправлять сообщения
  26. :param all_clients: все клиенты
  27. :return:
  28. """
  29. # Список входящих сообщений
  30. messages = []
  31.  
  32. for sock in r_clients:
  33. try:
  34. # Получаем входящие сообщения
  35. message = get_message(sock)
  36. # Добавляем их в список
  37. # В идеале нам нужно сделать еще проверку, что сообщение нужного формата прежде чем его пересылать!
  38. # Пока оставим как есть, этим займемся позже
  39. messages.append(message)
  40. except:
  41. print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername()))
  42. all_clients.remove(sock)
  43.  
  44. # Возвращаем словарь сообщений
  45. return messages
  46.  
  47. def write_responses(self, messages, w_clients, all_clients):
  48. """
  49. Отправка сообщений тем клиентам, которые их ждут
  50. :param messages: список сообщений
  51. :param w_clients: клиенты которые читают
  52. :param all_clients: все клиенты
  53. :return:
  54. """
  55.  
  56. for sock in w_clients:
  57. # Будем отправлять каждое сообщение всем
  58. for message in messages:
  59. try:
  60. # Отправить на тот сокет, который ожидает отправки
  61. send_message(sock, message)
  62. except: # Сокет недоступен, клиент отключился
  63. print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername()))
  64. sock.close()
  65. all_clients.remove(sock)
  66.  
  67. def preparing_responce(recieved_message):
  68. if 'action' in recieved_message and recieved_message['action'] == 'presence'\
  69. and 'time' in recieved_message and isinstance((recieved_message['time']), float):
  70. return {'responce': 200,
  71. 'time': time.time()
  72. }
  73. else:
  74. return {'responce': 400,
  75. 'error': 'Неверный запрос'}
  76.  
  77.  
  78. if __name__ == '__main__':
  79.  
  80. server = Server()
  81. clients = []
  82. while True:
  83. try:
  84. conn, addr = server.server_sock.accept() # Проверка подключений
  85. # получаем сообщение от клиента
  86. presence = get_message(conn)
  87. # формируем ответ
  88. response = preparing_responce(presence)
  89. print(response)
  90. # отправляем ответ клиенту
  91. send_message(conn, response)
  92. except OSError as e:
  93. pass # timeout вышел
  94. else:
  95. print("Получен запрос на соединение от %s" % str(addr))
  96. # Добавляем клиента в список
  97. clients.append(conn)
  98. finally:
  99. # Проверить наличие событий ввода-вывода
  100. wait = 0
  101. r = []
  102. w = []
  103. try:
  104. r, w, e = select.select(clients, clients, [], wait)
  105. except:
  106. pass # Ничего не делать, если какой-то клиент отключился
  107.  
  108. requests = server.read_requests(r, clients) # Получаем входные сообщения
  109. server.write_responses(requests, w, clients) # Выполним отправку входящих сообщений
Add Comment
Please, Sign In to add comment