Exemple #1
0
def main():
    client_args = parse_client_args()
    if client_args.v == 0:
        LOG.setLevel(logging.INFO)

    LOG.debug('create socket')
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv_socket:
        LOG.debug('connect to %(a)s:%(p)s', vars(client_args))
        srv_socket.connect((client_args.a, client_args.p))

        # presence надо отправить в любом случае - слушаем мы или отправляем
        LOG.debug('create presence')
        presence = get_jim_presence(client_args.u)
        LOG.debug('send presence: %s', presence)
        send_message(srv_socket, presence)
        srv_msg = process_srv_msg(get_message(srv_socket))
        LOG.info(srv_msg)
        while True:
            if client_args.s:
                msg_to_srv = ''
                while msg_to_srv.strip() == '':
                    msg_to_srv = input('Введите сообщение для отправки:')
                if msg_to_srv == 'exit':
                    return
                LOG.debug('send msg: %s', msg_to_srv)
                send_message(srv_socket,
                             get_jim_send_msg(msg_to_srv, client_args.u, None))
            else:
                try:
                    srv_msg = process_srv_msg(get_message(srv_socket))
                    LOG.info(srv_msg)
                except (ValueError, json.JSONDecodeError):
                    LOG.error('Не удалось обработать ответ сервера')
    def test_get_message(self):
        test_sock_ok = TestSocket(self.test_dict_receive_ok)
        test_sock_error = TestSocket(self.test_dict_receive_error)

        # проверка корректного получения корректного сообщения
        self.assertEqual(get_message(test_sock_ok), self.test_dict_receive_ok)
        # проверка корректного получения некорректного сообщения
        self.assertEqual(get_message(test_sock_error),
                         self.test_dict_receive_error)
 def test_get_message(self):
     """тест приёма"""
     # создадим тестовый сокет, с разными ответами
     testing_socket_with_ok = DummySocket(self.standart_answer_ok)
     testing_socket_with_error = DummySocket(self.standart_answer_error)
     # тестируем функцию на приём ответа
     self.assertEqual(get_message(testing_socket_with_ok),
                      self.standart_answer_ok)
     self.assertEqual(get_message(testing_socket_with_error),
                      self.standart_answer_error)
def main():
    """Загружаем параметы коммандной строки"""
    # client.py 192.168.1.2 8079
    """Загружаем параметы коммандной строки"""
    server_address, server_port, client_mode = arg_parser()

    CLIENT_LOGGER.info(f'Запущен клиент с парамертами: адрес сервера: '
                       f'{server_address}, порт: {server_port}')

    # Инициализация сокета и сообщение серверу о нашем появлении
    try:
        client_socket = socket(AF_INET, SOCK_STREAM)
        client_socket.connect((server_address, server_port))
        send_message(client_socket, create_new_presence())
        answer = process_response_answer(get_message(client_socket))
        CLIENT_LOGGER.info(f'Установлено соединение с сервером. Ответ сервера: {answer}')
        print(f'Установлено соединение с сервером.')
    except json.JSONDecodeError:
        CLIENT_LOGGER.error('Не удалось декодировать полученную Json строку.')
        sys.exit(1)
    except ServerError as error:
        CLIENT_LOGGER.error(f'При установке соединения сервер вернул ошибку: {error.text}')
        sys.exit(1)
    except ReqFieldMissingError as missing_error:
        CLIENT_LOGGER.error(f'В ответе сервера отсутствует необходимое поле {missing_error.missing_field}')
        sys.exit(1)
    except ConnectionRefusedError:
        CLIENT_LOGGER.critical(
            f'Не удалось подключиться к серверу {server_address}:{server_port}, '
            f'конечный компьютер отверг запрос на подключение.')
        sys.exit(1)
    else:
        # Если соединение с сервером установлено корректно,
        # начинаем обмен с ним, согласно требуемому режиму.
        # основной цикл прогрммы:
        if client_mode == 'send':
            print('Режим работы - отправка сообщений.')
        else:
            print('Режим работы - приём сообщений.')
        while True:
            # режим работы - отправка сообщений
            if client_mode == 'send':
                try:
                    send_message(client_socket, create_message(client_socket))
                except (ConnectionResetError, ConnectionError, ConnectionAbortedError):
                    CLIENT_LOGGER.error(f'Соединение с сервером {server_address} было потеряно.')
                    sys.exit(1)

            # Режим работы приём:
            if client_mode == 'listen':
                try:
                    message_from_server(get_message(client_socket))
                except (ConnectionResetError, ConnectionError, ConnectionAbortedError):
                    CLIENT_LOGGER.error(f'Соединение с сервером {server_address} было потеряно.')
                    sys.exit(1)
Exemple #5
0
 def test_get_message(self):
     """
     Тест функции приёма сообщения
     :return:
     """
     test_sock_ok = TestSocket(self.test_dict_recv_ok)
     test_sock_err = TestSocket(self.test_dict_recv_error)
     # тест корректной расшифровки корректного словаря
     self.assertEqual(get_message(test_sock_ok), self.test_dict_recv_ok)
     # тест корректной расшифровки ошибочного словаря
     self.assertEqual(get_message(test_sock_err), self.test_dict_recv_error)
def message_from_server(sock, my_username):
    """Функция - обработчик сообщений других пользователей, поступающих с сервера"""
    while True:
        try:
            message = get_message(sock)
            if (ACTION in message and message[ACTION] == MESSAGE
                    and SENDER in message and DESTINATION in message
                    and MESSAGE_TEXT in message
                    and message[DESTINATION] == my_username):
                print(
                    f"\nПолучено сообщение от пользователя {message[SENDER]}:"
                    f"\n{message[MESSAGE_TEXT]}")
                print(f"Получено сообщение от пользователя {message[SENDER]}:"
                      f"\n{message[MESSAGE_TEXT]}")
            else:
                print(f"Получено некорректное сообщение с сервера: {message}")
        except IncorrectDataRecivedError:
            print(f"Не удалось декодировать полученное сообщение.")
        except (
                OSError,
                ConnectionError,
                ConnectionAbortedError,
                ConnectionResetError,
                json.JSONDecodeError,
        ):
            print(f"Потеряно соединение с сервером.")
            break
Exemple #7
0
 def test_get_message(self):
     test_message = {"response": "200", "alert": "test"}
     test_socket = TestSocket(test_message)
     self.assertEqual(get_message(test_socket, self.CONFIGS), {
         'response': '200',
         'alert': 'test'
     })
Exemple #8
0
def main():
    srv_args = parse_srv_args()
    if srv_args.v == 0:
        LOG.setLevel(logging.INFO)

    LOG.debug('create socket')
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as transport:
        transport.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        LOG.debug('bind socket to %(a)s:%(p)s', vars(srv_args))
        transport.bind((srv_args.a, srv_args.p))

        LOG.debug('start listening')
        transport.listen(MAX_CONNECTIONS)

        while True:
            LOG.debug('waiting for client...')
            client, client_addr = transport.accept()
            with client:
                try:
                    LOG.debug('get msg from %s', client)
                    msg_from_client = get_message(client)
                    LOG.info('msg: %s', msg_from_client)
                    LOG.debug('process_client_msg()')
                    response = process_client_msg(msg_from_client)
                    LOG.debug('send response: %s', response)
                    send_message(client, response)
                except (ValueError, json.JSONDecodeError):
                    LOG.error('Принято некорректное сообщение от клиента.')
Exemple #9
0
def get_users_message(user_socket, _user_name):
    """
    Постоянное получение сообщений, так как для этого запускается в отдельном
    потоке.
    Проверка сообщений от пользователей, приходящих с сервера, на
    соответствие протоколу JIM.
    """
    while True:
        try:
            # получение сообщения из сокета
            user_msg_from_server = get_message(user_socket)
            # валидация
            if parsing_response_of_users_message(user_msg_from_server,
                                                 _user_name):
                LOGGER.debug(f'\nПолучено сообщение:'
                             f'{user_msg_from_server[MESSAGE_TEXT]}\n'
                             f' от пользователя:'
                             f'{user_msg_from_server[SENDER]}\n'
                             f'отправлено в {user_msg_from_server[TIME]}\n'
                             f'получено через '
                             f'{time.time() - user_msg_from_server[TIME]} '
                             f'сек.')
                print(f'От:{user_msg_from_server[SENDER]} \n'
                      f'сообщение:{user_msg_from_server[MESSAGE_TEXT]}\n'
                      f'отправлено в {time.ctime(user_msg_from_server[TIME])}')

        except (ConnectionError, ConnectionResetError, ConnectionRefusedError,
                ConnectionAbortedError):
            LOGGER.error(f'Потеря связи! Сервер '
                         f'{user_socket.getpeername()} '
                         f'не доступен.')
            sys.exit(1)
def main():
    '''
    Загружаем параметы коммандной строки
    '''
    # client.py 192.168.1.2 8079
    try:
        server_address = sys.argv[1]
        server_port = int(sys.argv[2])
        if not 1023 < server_port < 65536:
            LOGGER_CLIENT.critical(f'Запуск клиента с недопустимым портом {server_port} невозможен')
            raise ValueError
        LOGGER_CLIENT.debug(f'Клиент запущен по адресу {server_address} и порту {server_port}')
    except IndexError:
        server_address = DEFAULT_IP_ADDRESS
        server_port = DEFAULT_PORT
        LOGGER_CLIENT.debug(f'Используемся адрес {server_address} и порт {server_port} по умолчанию')
    except ValueError:
        LOGGER_CLIENT.info('В качестве порта может быть указано только число в диапазоне от 1024 до 65535.')
        sys.exit(1)

    # Инициализация сокета и обмен
    transport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    transport.connect((server_address, server_port))
    message_to_server = create_presence()
    send_message(transport, message_to_server)
    LOGGER_CLIENT.debug(f'Отправили сообщение {message_to_server} на сервер')
    try:
        answer = process_ans(get_message(transport))
        LOGGER_CLIENT.info(f'Получен ответ от сервера {answer}')
        print(answer)
    except (ValueError, json.JSONDecodeError):
        LOGGER_CLIENT.error('Не удалось декодировать сообщение сервера.')
Exemple #11
0
    def run(self):
        """Метод содержащий основной цикл работы транспортного потока."""
        client_logger.debug('Запущен процесс - приёмник собщений с сервера.')
        while self.running:
            # Отдыхаем секунду и снова пробуем захватить сокет.
            # если не сделать тут задержку, то отправка может достаточно долго
            # ждать освобождения сокета.
            time.sleep(1)
            message = None
            with socket_lock:
                try:
                    self.transport.settimeout(0.5)
                    message = get_message(self.transport, CONFIGS)
                except OSError as err:
                    if err.errno:
                        client_logger.critical(
                            f'Потеряно соединение с сервером.')
                        self.running = False
                        self.connection_lost.emit()
                # Проблемы с соединением
                except (ConnectionError, ConnectionAbortedError,
                        ConnectionResetError, json.JSONDecodeError, TypeError):
                    client_logger.debug(f'Потеряно соединение с сервером.')
                    self.running = False
                    self.connection_lost.emit()
                finally:
                    self.transport.settimeout(5)

                # Если сообщение получено, то вызываем функцию обработчик:
                if message:
                    client_logger.debug(
                        f'Принято сообщение с сервера: {message}')
                    self.process_server_ans(message)
def main():
    parser = create_argument_parser()
    namespace = parser.parse_args(sys.argv[1:])
    server_address = namespace.addr
    server_port = namespace.port

    if not 1023 < server_port < 65536:
        logging_client.critical(
            f'Попытка запуска клиента с неподходящим номером порта: {server_port}.'
            f' Допустимы адреса с 1024 до 65535. Клиент завершается.')
        sys.exit(1)

    logging_client.info(
        f'Запущен клиент с парамертами: '
        f'адрес сервера: {server_address}, порт: {server_port}')
    try:
        transport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        transport.connect((server_address, server_port))
        message_to_server = create_presence()
        send_message(transport, message_to_server)
        answer = process_answer(get_message(transport))
        logging_client.info(f'Принят ответ от сервера {answer}')
        print(answer)
    except json.JSONDecodeError:
        logging_client.error('Не удалось декодировать полученную Json строку.')
    except RequiredFieldMissingError as missing_error:
        logging_client.error(f'В ответе сервера отсутствует необходимое поле '
                             f'{missing_error.missing_field}')
    except ConnectionRefusedError:
        logging_client.critical(
            f'Не удалось подключиться к серверу {server_address}:{server_port}, '
            f'конечный компьютер отверг запрос на подключение.')
Exemple #13
0
    def run(self):
        """Функция содержащая основной цикл работы транспортного потока."""
        LOGGER.debug('Запущен процесс приема сообщений с сервера')
        while self.running:
            time.sleep(1)
            with sock_lock:
                try:
                    self.transport.settimeout(0.5)
                    message = get_message(self.transport)
                except OSError as e:
                    if e.errno:
                        LOGGER.critical(f'Соединение с сервером потеряно')
                        self.running = False
                        self.connection_lost.emit()
                except IncorrectDataRecivedError:
                    LOGGER.error(f'Не удалось декодировать сообщение')
                except (ConnectionError, ConnectionAbortedError, ConnectionResetError, json.JSONDecodeError, TypeError):
                    LOGGER.critical(f'Соединение с сервером потеряно')
                    self.running = False
                    self.connection_lost.emit()
                finally:
                    self.transport.settimeout(1)

        # Если сообщение получено, то вызываем функцию обработчик:
        if message:
            LOGGER.debug(f'Принято сообщение с сервера: {message}')
            self.process_ans(message)
Exemple #14
0
def test_get_message():
    test_message = {"response": "200", "alert": "test"}
    test_socket = Test_Socket(test_message)
    assert get_message(test_socket, CONFIGS) == {
        "response": "200",
        "alert": "test"
    }
Exemple #15
0
 def run(self):
     """Basic function to run server."""
     self.init_socket()
     while self.running:
         try:
             client, client_address = self.sock.accept()
         except OSError:
             pass
         else:
             logger.info(f'Applied connection from {client_address}')
             client.settimeout(5)
             self.clients.append(client)
         recv_data_lst = []
         send_data_lst = []
         err_lst = []
         try:
             if self.clients:
                 recv_data_lst, self.listen_sockets, self.error_sockets = select.select(
                     self.clients, self.clients, [], 0)
         except OSError as err:
             logger.error(f'Socket Error: {err.errno}')
         if recv_data_lst:
             for client_with_message in recv_data_lst:
                 try:
                     self.process_client_message(
                         get_message(client_with_message),
                         client_with_message)
                 except (OSError, json.JSONDecodeError, TypeError):
                     self.remove_client(client_with_message)
Exemple #16
0
def main():
    """
    Основная функция клиента, связывается с сервером, отправляет ему сообщение
    и получает ответ от него.
    :return: None
    """
    try:
        server_address = sys.argv[1]
        server_port = int(sys.argv[2])
        if server_port < 1024 or server_port > 65535:
            raise ValueError
    except IndexError:
        server_address = DEFAULT_IP_ADDRESS
        server_port = DEFAULT_PORT
    except ValueError:
        print('В качестве порта может быть указано значение от 1024 до 65535.')
        sys.exit(1)

    client_socket = socket(AF_INET, SOCK_STREAM)
    client_socket.connect((server_address, server_port))
    message_to_server = create_message(PRESENCE)
    send_message(client_socket, message_to_server)
    try:
        answer = get_answer(get_message(client_socket))
        print(f'Server answer: {answer}')
    except (ValueError, json.JSONDecodeError):
        print('Не удалось декодировать сообщение сервера.')
def main():
    """Загружаем параметы коммандной строки"""
    parser = create_arg_parser()
    namespace = parser.parse_args(sys.argv[1:])
    server_address = namespace.addr
    server_port = namespace.port

    # проверим подходящий номер порта
    if not 1023 < server_port < 65536:
        LOGGER.critical(
            f'Попытка запуска клиента с неподходящим номером порта: {server_port}. '
            f'Допустимы адреса с 1024 до 65535. Клиент завершается.')
        sys.exit(1)

    LOGGER.info(f'Запущен клиент с парамертами: адрес сервера: '
                f'{server_address}, порт: {server_port}')
    # Инициализация сокета и обмен

    try:
        transport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        transport.connect((server_address, server_port))
        message_to_server = create_presence()
        send_message(transport, message_to_server)
        answer = process_ans(get_message(transport))
        LOGGER.info(f'Принят ответ от сервера {answer}')
    except json.JSONDecodeError:
        LOGGER.error('Не удалось декодировать полученную Json строку.')
    except ReqFieldMissingError as missing_error:
        LOGGER.error(
            f'В ответе сервера отсутствует необходимое поле {missing_error.missing_field}'
        )
    except ConnectionRefusedError:
        LOGGER.critical(
            f'Не удалось подключиться к серверу {server_address}:{server_port}, '
            f'конечный компьютер отверг запрос на подключение.')
Exemple #18
0
    def test_send_message_ok(self):
        msg = {'tst_key': 'tst_value ₽'}
        send_message(self.client_socket, msg)
        # будем считать, что если тесты выше пройдены - то get_message работает нормально
        incoming_msg = get_message(self.client_to_srv)

        self.assertEqual(incoming_msg, msg)
Exemple #19
0
    def run(self):
        """Основной цикл работы потока"""
        client_logger.debug('Запущен процесс - приёмник собщений с сервера.')
        while self.running:
            time.sleep(1)
            message = None
            with socket_lock:
                try:
                    self.client_sock.settimeout(0.5)
                    message = get_message(self.client_sock)
                except OSError as err:
                    if err.errno:
                        client_logger.critical(
                            f'Потеряно соединение с сервером.')
                        self.running = False
                        self.connection_lost.emit()
                except (ConnectionError, ConnectionAbortedError,
                        ConnectionResetError, json.JSONDecodeError, TypeError):
                    client_logger.debug(f'Потеряно соединение с сервером.')
                    self.running = False
                    self.connection_lost.emit()
                finally:
                    self.client_sock.settimeout(5)

            if message:
                client_logger.debug(f'Принято сообщение с сервера: {message}')
                self.server_response_handler(message)
Exemple #20
0
    def run(self):
        """Метод основной цикл потока."""
        self.init_socket()

        while self.running:
            try:
                client, client_address = self.sock.accept()
            except OSError:
                pass
            else:
                logger.info(f'Установлено соедение с ПК {client_address}')
                client.settimeout(5)
                self.clients.append(client)

            recv_data_lst = []
            send_data_lst = []
            err_lst = []
            try:
                if self.clients:
                    recv_data_lst, self.listen_sockets, self.error_sockets = select.select(
                        self.clients, self.clients, [], 0)
            except OSError as err:
                logger.error(f'Ошибка работы с сокетами: {err.errno}')

            if recv_data_lst:
                for client_with_message in recv_data_lst:
                    try:
                        self.process_client_message(
                            get_message(client_with_message),
                            client_with_message)
                    except (OSError, json.JSONDecodeError, TypeError):
                        self.remove_client(client_with_message)
Exemple #21
0
    def get_user_answer(self, sock):
        """Обрабатка сообщения сервера"""
        CLIENT_LOG.debug('Обрабатка сообщения сервера')
        while True:
            try:
                message = get_message(sock)
                if ACTION in message and message[ACTION] == MSG and \
                        SENDER in message and TO in message and \
                        MESSAGE in message and \
                        message[TO] == self.account_name:
                    time_mess = datetime.fromtimestamp(message[TIME]).\
                        strftime("%H:%M:%S")
                    user_msg = f'[{time_mess}] {message[SENDER]}: \
{message[MESSAGE]}'

                    print(f'{user_msg}')
                    CLIENT_LOG.info(f'{user_msg}')
                else:
                    CLIENT_LOG.debug(f'Некорректное сообщение от сервера: \
{message}')
                    CLIENT_LOG.critical('Принято некорректное сообщение от \
        сервера: {message}')
            except (OSError, ConnectionError, ConnectionAbortedError,
                    ConnectionResetError, json.JSONDecodeError):
                CLIENT_LOG.critical(f'Потеряно соединение с сервером.')
                break
Exemple #22
0
 def __call__(self):
     print(f'Клиент с ником: {self.account_name}')
     try:
         CLIENT = socket(AF_INET, SOCK_STREAM)
         CLIENT.connect((self.address, self.port))
         send_message(CLIENT, self.create_presence())
         answer = self.process_answer(get_message(CLIENT))
         CLIENT_LOG.info(f'Установлено соединение с сервером: {answer}')
         print('Установлено соединение с сервером')
     except json.JSONDecodeError:
         CLIENT_LOG.error('Не удалось декодировать JSON строку')
         sys.exit(1)
     except (ConnectionRefusedError, ConnectionError):
         CLIENT_LOG.error(f'Не удалось подключиться к серверу \
 {self.address}:{self.port}')
         sys.exit(1)
     else:
         receiver = Thread(target=self.get_user_answer, args=(CLIENT, ))
         receiver.daemon = True
         receiver.start()
         self.user_interface = Thread(target=self.user_interactive,
                                      args=(CLIENT, ))
         self.user_interface.daemon = True
         self.user_interface.start()
         CLIENT_LOG.info('Запущены потоки')
         while True:
             sleep(1)
             if receiver.is_alive() and self.user_interface.is_alive():
                 continue
             break
Exemple #23
0
def main():
    '''
    Загружаем параметы коммандной строки
    :return:
    '''
    try:
        server_address = sys.argv[1]
        server_port = int(sys.argv[2])
        if server_port < 1024 or server_port > 65535:
            raise ValueError
    except IndexError:
        server_address = DEFAULT_IP_ADDRESS
        server_port = DEFAULT_PORT
    except ValueError:
        print(
            'В качастве порта может быть указано только число в диапазоне от 1024 до 65535.'
        )
        sys.exit(1)

    # Инициализация сокета и обмен

    transport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    transport.connect((server_address, server_port))
    message_to_server = create_presence()
    send_message(transport, message_to_server)
    try:
        answer = process_ans(get_message(transport))
        print(answer)
    except (ValueError, json.JSONDecodeError):
        print('Не удалось декодировать сообщение сервера.')
Exemple #24
0
    def main_loop(self):
        client_args = parse_client_args()
        if client_args.v != 0:
            LOG.setLevel(logging.DEBUG)

        LOG.debug('create socket')
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv_socket:
            LOG.debug('connect to %(a)s:%(p)s', vars(client_args))
            srv_socket.connect((client_args.a, client_args.p))

            # presence надо отправить в любом случае - слушаем мы или отправляем
            LOG.debug('create presence')
            presence = get_jim_presence(client_args.u)
            LOG.debug('send presence: %s', presence)
            send_message(srv_socket, presence)
            srv_msg = self.process_srv_msg(get_message(srv_socket))
            LOG.info(srv_msg)

            LOG.debug('Create input_thread')
            input_thread = Thread(target=self.processing_input, args=(srv_socket, client_args.u))
            input_thread.daemon = True
            input_thread.start()
            LOG.debug('input_thread started')

            LOG.debug('Create output_thread')
            output_thread = Thread(target=self.processing_output, args=(srv_socket, client_args.u))
            output_thread.daemon = True
            output_thread.start()
            LOG.debug('output_thread started')

            while True:
                sleep(1)
                if input_thread.is_alive() and output_thread.is_alive():
                    continue
                break
Exemple #25
0
    def run(self):
        # Инициализация Сокета
        self.init_socket()

        # Основной цикл программы сервера
        while self.running:
            # Ждём подключения, если таймаут вышел, ловим исключение.
            try:
                client, client_address = self.sock.accept()
            except OSError:
                pass
            else:
                logger.info(f'Установлено соедение с ПК {client_address}')
                client.settimeout(5)
                self.clients.append(client)

            recv_data_lst = []
            send_data_lst = []
            err_lst = []
            # Проверяем на наличие ждущих клиентов
            try:
                if self.clients:
                    recv_data_lst, self.listen_sockets, self.error_sockets = select.select(
                        self.clients, self.clients, [], 0)
            except OSError as err:
                logger.error(f'Ошибка работы с сокетами: {err.errno}')

            # принимаем сообщения и если ошибка, исключаем клиента.
            if recv_data_lst:
                for client_with_message in recv_data_lst:
                    try:
                        self.process_client_message(get_message(client_with_message), client_with_message)
                    except (OSError, json.JSONDecodeError, TypeError):
                        self.remove_client(client_with_message)
def main():
    '''
    Загрузка параметров командной строки, если нет параметров, то задаём значения по умоланию.
    Сначала обрабатываем порт:
    server.py -p 8079 -a 192.168.1.2
    :return:
    '''

    try:
        if '-p' in sys.argv:
            listen_port = int(sys.argv[sys.argv.index('-p') + 1])
        else:
            listen_port = DEFAULT_PORT
        if listen_port < 1024 or listen_port > 65535:
            raise ValueError
    except IndexError:
        print('После параметра -\'p\' необходимо указать номер порта.')
        sys.exit(1)
    except ValueError:
        print(
            'В качастве порта может быть указано только число в диапазоне от 1024 до 65535.'
        )
        sys.exit(1)

    # Затем загружаем какой адрес слушать

    try:
        if '-a' in sys.argv:
            listen_address = sys.argv[sys.argv.index('-a') + 1]
        else:
            listen_address = ''

    except IndexError:
        print(
            'После параметра \'a\'- необходимо указать адрес, который будет слушать сервер.'
        )
        sys.exit(1)

    # Готовим сокет

    transport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    transport.bind((listen_address, listen_port))

    # Слушаем порт

    transport.listen(MAX_CONNECTIONS)

    while True:
        client, client_address = transport.accept()
        try:
            message_from_cient = get_message(client)
            print(message_from_cient)
            # {'action': 'presence', 'time': 1573760672.167031, 'user': {'account_name': 'Guest'}}
            response = process_client_message(message_from_cient)
            send_message(client, response)
            client.close()
        except (ValueError, json.JSONDecodeError):
            print('Принято некорретное сообщение от клиента.')
            client.close()
Exemple #27
0
    def test_get_message_ok(self):
        msg = {'tst_key': 'tst_value ₽'}
        json_msg = json.dumps(msg)
        outcoming_encoded_msg = json_msg.encode(ENCODING)
        self.client_socket.send(outcoming_encoded_msg)
        incoming_msg = get_message(self.client_to_srv)

        self.assertEqual(incoming_msg, msg)
Exemple #28
0
def main():
    '''
    Загружаем параметы коммандной строки
    '''
    server_address, server_port, client_mode = arg_parser()

    LOGGER_CLIENT.info(f'Запущен клиент с адресом сервера: {server_address}, '
                       f'портом: {server_port} и режимом работы: {client_mode}')
    try:
        transport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        transport.connect((server_address, server_port))
        send_message(transport, create_presence())
        answer = process_ans(get_message(transport))
        LOGGER_CLIENT.info(f'Установлено соединение с сервером. Ответ сервера: {answer}')
        print(f'Установлено соединение с сервером.')
    except json.JSONDecodeError:
        LOGGER_CLIENT.error('Не удалось декодировать полученную Json строку.')
        sys.exit(1)
    except ServerError as error:
        LOGGER_CLIENT.error(f'При установке соединения сервер вернул ошибку: {error.text}')
        sys.exit(1)
    except ReqFieldMissingError as missing_error:
        LOGGER_CLIENT.error(f'В ответе сервера отсутствует необходимое поле {missing_error.missing_field}')
        sys.exit(1)
    except ConnectionRefusedError:
        LOGGER_CLIENT.critical(
            f'Не удалось подключиться к серверу {server_address}:{server_port}')
        sys.exit(1)
    else:
        if client_mode == 'send':
            print('Режим работы - отправка сообщений.')
        else:
            print('Режим работы - приём сообщений.')
        while True:
            if client_mode == 'send':
                try:
                    send_message(transport, create_message(transport))
                except (ConnectionResetError, ConnectionError, ConnectionAbortedError):
                    LOGGER_CLIENT.error(f'Соединение с сервером {server_address} было потеряно.')
                    sys.exit(1)
            if client_mode == 'listen':
                try:
                    message_from_server(get_message(transport))
                except (ConnectionResetError, ConnectionError, ConnectionAbortedError):
                    LOGGER_CLIENT.error(f'Соединение с сервером {server_address} было потеряно.')
                    sys.exit(1)
Exemple #29
0
    def autorize_user(self, message, sock):
        """Authorize function. Receive a values from client.
        Send a result of authorizing.
        """

        if message[USER][ACCOUNT_NAME] in self.names.keys():
            response = RESPONSE_400
            response[ERROR] = 'Username is already exists'
            try:
                send_message(sock, response)
            except OSError:
                pass
            self.clients.remove(sock)
            sock.close()
        elif not self.database.check_user(message[USER][ACCOUNT_NAME]):
            response = RESPONSE_400
            response[ERROR] = "User is not registered"
            try:
                send_message(sock, response)
            except OSError:
                pass
            self.clients.remove(sock)
            sock.close()
        else:
            message_auth = RESPONSE_511
            random_str = binascii.hexlify(os.urandom(64))
            message_auth[DATA] = random_str.decode('ascii')
            hash = hmac.new(
                self.database.get_hash(message[USER][ACCOUNT_NAME]),
                random_str)
            digest = hash.digest()
            try:
                send_message(sock, message_auth)
                ans = get_message(sock)
            except OSError:
                sock.close()
                return
            client_digest = binascii.a2b_base64(ans[DATA])
            if RESPONSE in ans and ans[RESPONSE] == 511 and hmac.compare_digest(
                    digest, client_digest):
                self.names[message[USER][ACCOUNT_NAME]] = sock
                client_ip, client_port = sock.getpeername()
                try:
                    send_message(sock, RESPONSE_200)
                except OSError:
                    self.remove_client(message[USER][ACCOUNT_NAME])
                self.database.user_login(message[USER][ACCOUNT_NAME],
                                         client_ip, client_port,
                                         message[USER][PUBLIC_KEY])
            else:
                response = RESPONSE_400
                response[ERROR] = 'Incorrect password'
                try:
                    send_message(sock, response)
                except OSError:
                    pass
                self.clients.remove(sock)
                sock.close()
Exemple #30
0
def main():
    '''Загружаем параметы коммандной строки'''
    if '-a' in sys.argv:
        server_address = sys.argv[sys.argv.index('-a') + 1]
    else:
        server_address = DEFAULT_IP
        CLIENT_LOGGER.info(
            f'Не найден параметр -\'a\'.'
            f'Установлено стандартное значение IP адреса: {server_address}')
    if '-p' in sys.argv:
        server_port = int(sys.argv[sys.argv.index('-p') + 1])
    else:
        server_port = DEFAULT_PORT
        CLIENT_LOGGER.info(
            f'Не найден параметр -\'p\'.'
            f'Установлено стандартное значение порта: {server_port}')
    try:
        # Проверка IP адреса, если не соответсвует регулярке то выкинет исключение AttributeError
        [
            0 <= int(x) < 256 for x in re.split(
                '\.',
                re.match(r'^\d+\.\d+\.\d+\.\d+$', server_address).group(0))
        ].count(True) == 4
        if server_port < 1024 or server_port > 65535:
            raise AttributeError

    except AttributeError:
        server_address = DEFAULT_IP
        server_port = DEFAULT_PORT
        CLIENT_LOGGER.critical(
            f'Попытка запуска клиента с неподходящим номером порта или IP адреса.'
            f'Установлены стандартные значения для '
            f'подключения {server_port},{server_address}')

    CLIENT_LOGGER.info(
        f'Запущен клиент с парамертами: '
        f'адрес сервера: {server_address} , порт: {server_port}')
    # Инициализация сокета и обмен

    transport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        transport.connect((server_address, server_port))
    except ConnectionRefusedError:
        CLIENT_LOGGER.critical(
            f'Не удалось подключиться к серверу {server_address}:{server_port}, '
            f'конечный компьютер отверг запрос на подключение.')
        sys.exit(1)
    message_to_server = create_presence()
    send_message(transport, message_to_server)
    try:
        answer = process_ans(get_message(transport))
        CLIENT_LOGGER.info(f'Принят ответ от сервера {answer}')
    except json.JSONDecodeError:
        CLIENT_LOGGER.error('Не удалось декодировать полученную Json строку.')
    except ReqFieldMissingError as error:
        CLIENT_LOGGER.error(f'В ответе сервера отсутствует необходимое поле '
                            f'{error.missing_field}')