Advertisement
pegorino

server

Dec 23rd, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1. import socket
  2. import sys
  3. import json
  4. import time
  5.  
  6. from cmd_utils import command_server
  7. from log_config import server_log
  8.  
  9. HOST = '127.0.0.1'
  10. PORT = 7777
  11.  
  12. CODING = 'utf-8'
  13.  
  14. CODES = {100: 'Базовое уведомление', 101: 'Важное уведомление', 200: 'ОК', 201: 'Объект создан',
  15. 202: 'Подтверждение', 400: 'Неправильный запрос/JSON-объект', 401: 'Не авторизован',
  16. 402: 'Неправильный логин/пароль', 403: 'Пользователь заблокирован',
  17. 404: 'Пользователь/чат отсутствует на сервере', 409: 'Уже имеется подключение с указанным логином',
  18. 410: 'Адресат существует, но недоступен(offline)', 500: 'Ошибка сервера'}
  19.  
  20. CODE = 200
  21.  
  22.  
  23. # принимает, разбирает сообщение(request) и формирует ответ(response)
  24. @server_log
  25. def get_request(client):
  26. '''
  27. возвращает запрос от клиента в dict
  28. :param client: сокет клиента
  29. :return: request клиента
  30. '''
  31. try:
  32. data = client.recv(1024)
  33. message = json.loads(data.decode(CODING))
  34. return message
  35. except socket.error:
  36. print('Возникла ошибка при получении сообщения от клиента')
  37.  
  38.  
  39. @server_log
  40. def make_response(code):
  41. '''
  42. готовит ответ для отправки клиенту
  43. :param code: код состояния из CODES
  44. :return: response для отправки клиенту
  45. '''
  46. answer = {'response': code, 'time': time.time()}
  47. if code < 400:
  48. answer['alert'] = CODES[code]
  49. else:
  50. answer['error'] = CODES[code]
  51. return answer
  52.  
  53.  
  54. @server_log
  55. def send_response(client, answer):
  56. '''
  57. отправляет клиенту ответ на запрос
  58. :param client: сокет клиента
  59. :param answer: ответ клиенту (make_response())
  60. :return:
  61. '''
  62. data = json.dumps(answer).encode(CODING)
  63. client_name = client.getsockname() # ('127.0.0.1', 7777)
  64. try:
  65. client.send(data)
  66. client.close()
  67. return True
  68. except socket.error:
  69. print('Возникла ошибка при отправке сообщения клиенту, IP: {}'.format(client_name[1]))
  70. return False
  71.  
  72.  
  73. def show_log(message, addr, count=None):
  74. '''
  75. выводит в консоль информацию о запросе:
  76. соединение 1
  77. =======================================================
  78. Получен запрос на соединение от 127.0.0.1
  79. соединение с User,
  80. запрос по времени клиента 21.12.2017 - 16:41:52
  81. =======================================================
  82. :param message: get_request
  83. :param addr: адрес сокета клиента
  84. :param count: номер запроса на сервер
  85. :return:
  86. '''
  87. # выводим информацию о соединении в консоль
  88. print('соединение ', count, '\n' + '=' * 55, '\n' + 'Получен запрос на соединение от {}'.format(addr[0]))
  89. user = message['user']['account_name']
  90. p_date = time.localtime(message['time'])
  91. date = time.strftime('%d.%m.%Y - %H:%M:%S', p_date)
  92. print('соединение с {},\nзапрос по времени клиента {}'.format(user, date), '\n' + '=' * 55)
  93.  
  94.  
  95. @server_log
  96. def run_server(params):
  97. count = 1
  98. sock = socket.socket()
  99. sock.bind(params)
  100. sock.listen(5)
  101. while True:
  102. try:
  103. client, addr = sock.accept()
  104.  
  105. message = get_request(client)
  106. show_log(message, addr, count=count)
  107.  
  108. answer = make_response(CODE)
  109. send_response(client, answer)
  110.  
  111. count += 1
  112. client.close()
  113. # выключает сервер по ctrl + C
  114. except KeyboardInterrupt:
  115. print('=' * 50 + '\n', 'Сервер недоступен')
  116. sock.close()
  117. sys.exit()
  118.  
  119.  
  120. if __name__ == '__main__':
  121. run_server(command_server(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement