Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- import sys
- import json
- import time
- from cmd_utils import command_server
- from log_config import server_log
- HOST = '127.0.0.1'
- PORT = 7777
- CODING = 'utf-8'
- CODES = {100: 'Базовое уведомление', 101: 'Важное уведомление', 200: 'ОК', 201: 'Объект создан',
- 202: 'Подтверждение', 400: 'Неправильный запрос/JSON-объект', 401: 'Не авторизован',
- 402: 'Неправильный логин/пароль', 403: 'Пользователь заблокирован',
- 404: 'Пользователь/чат отсутствует на сервере', 409: 'Уже имеется подключение с указанным логином',
- 410: 'Адресат существует, но недоступен(offline)', 500: 'Ошибка сервера'}
- CODE = 200
- # принимает, разбирает сообщение(request) и формирует ответ(response)
- @server_log
- def get_request(client):
- '''
- возвращает запрос от клиента в dict
- :param client: сокет клиента
- :return: request клиента
- '''
- try:
- data = client.recv(1024)
- message = json.loads(data.decode(CODING))
- return message
- except socket.error:
- print('Возникла ошибка при получении сообщения от клиента')
- @server_log
- def make_response(code):
- '''
- готовит ответ для отправки клиенту
- :param code: код состояния из CODES
- :return: response для отправки клиенту
- '''
- answer = {'response': code, 'time': time.time()}
- if code < 400:
- answer['alert'] = CODES[code]
- else:
- answer['error'] = CODES[code]
- return answer
- @server_log
- def send_response(client, answer):
- '''
- отправляет клиенту ответ на запрос
- :param client: сокет клиента
- :param answer: ответ клиенту (make_response())
- :return:
- '''
- data = json.dumps(answer).encode(CODING)
- client_name = client.getsockname() # ('127.0.0.1', 7777)
- try:
- client.send(data)
- client.close()
- return True
- except socket.error:
- print('Возникла ошибка при отправке сообщения клиенту, IP: {}'.format(client_name[1]))
- return False
- def show_log(message, addr, count=None):
- '''
- выводит в консоль информацию о запросе:
- соединение 1
- =======================================================
- Получен запрос на соединение от 127.0.0.1
- соединение с User,
- запрос по времени клиента 21.12.2017 - 16:41:52
- =======================================================
- :param message: get_request
- :param addr: адрес сокета клиента
- :param count: номер запроса на сервер
- :return:
- '''
- # выводим информацию о соединении в консоль
- print('соединение ', count, '\n' + '=' * 55, '\n' + 'Получен запрос на соединение от {}'.format(addr[0]))
- user = message['user']['account_name']
- p_date = time.localtime(message['time'])
- date = time.strftime('%d.%m.%Y - %H:%M:%S', p_date)
- print('соединение с {},\nзапрос по времени клиента {}'.format(user, date), '\n' + '=' * 55)
- @server_log
- def run_server(params):
- count = 1
- sock = socket.socket()
- sock.bind(params)
- sock.listen(5)
- while True:
- try:
- client, addr = sock.accept()
- message = get_request(client)
- show_log(message, addr, count=count)
- answer = make_response(CODE)
- send_response(client, answer)
- count += 1
- client.close()
- # выключает сервер по ctrl + C
- except KeyboardInterrupt:
- print('=' * 50 + '\n', 'Сервер недоступен')
- sock.close()
- sys.exit()
- if __name__ == '__main__':
- run_server(command_server(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement