示例#1
0
 def quit_process(self):
     message = self.create_close_msg()
     send_message(socket=self.socket, message=message)
     logger.info(
         f'Отправлено уведомление о выходе на сервер (client {self.login})  {message}'
     )  #
     response = self.request_queue.get()
     self.print_response(response)
     logger.info(f'Произведён выход (client {user.login})')  #
     self.socket.close()
示例#2
0
 def del_contact(self, login):
     # нужна проверка на наличие логина в списке контаков пользователя
     msg = self.create_del_contact_msg(login)
     send_message(socket=self.socket, message=msg)
     logger.info(
         f'Отправлен запрос на удаление контакта (client {self.login} {msg})'
     )  #
     response = self.request_queue.get()
     logger.info(f'Получен ответ от сервера {response}')  #
     return response
示例#3
0
 def get_contacts(self):
     """ Запрашивает список контактов и возвращает их с сод ответа"""
     msg = self.create_get_contact_msg()
     send_message(socket=self.socket, message=msg)
     logger.info(
         f'Отправлен запрос "список контактов" (client {self.login})  {msg}'
     )  #
     response = self.request_queue.get()
     logger.info(f'Получен ответ от сервера {response}')  #
     contacts = response['alert']
     cod = response['response']
     return cod, contacts
示例#4
0
    def connect_control(self):
        """ Процедура опроса клиента """

        # презентс ->
        presence = self.create_presence()
        send_message(socket=self.socket, message=presence)
        logger.info(f'Отправлен презент серверу (client {self.login})')  #
        self.add_user()
        # респонс <-
        response = get_message(self.socket)
        # респонс <!>
        self.response_control(response)
        return
示例#5
0
 def write_massage(self, to_name):
     text = None
     while text != 'Q':
         text = input('\r[?]-опции. Сообщение всем >>>')
         if text == 'Q':
             # процедура выхода
             self.quit_process()
         elif text == '?':
             print(
                 '[Q]-выход \n[A:name]-добавить контакт (для теста Смелый)'
                 ' \n[D:name]-удалить контакт (для теста Смелый)'
                 ' \n[L]-получить список контатков')
         elif text.startswith('A:'):
             # добавление нового контакта
             command, name = text.split(':')
             answer = self.add_contact(name)
             # запрашиваем список контактов
             self.print_response(answer)
             if answer['response'] == 201:
                 self.update_contacts()
             self.show_contacts()
         elif text == 'L':
             # запрашиваем список контактов
             self.show_contacts()
         elif text.startswith('D:'):
             # удаление контакта
             command, name = text.split(':')
             answer = self.del_contact(name)
             # запрашиваем список контактов
             self.print_response(answer)
             if answer['response'] == 203:
                 self.update_contacts()
             self.show_contacts()
         else:
             if text != '':
                 # отправка простого сообщения
                 message = self.create_message(to_name=to_name, text=text)
                 self.base.add_message_history(login=message['from'],
                                               time_point=message['time'],
                                               text=text,
                                               frend_login=message['to'])
                 logger.info(
                     f'Отправлено сообщение на сервер (client {self.login})  {message}'
                 )  #
                 send_message(socket=self.socket, message=message)
示例#6
0
 def connect_protocol(self, socket, ip):
     """ Протокол опроса клиента
     Очень много всего надо как-то переделать """
     # Связываем ip адрес и сокет
     self.sock_ip[socket] = ip
     # проба ->
     probe = utils.msg.Probe()
     probe = probe.pack()
     send_message(socket, probe)
     logger.info(f'отправленна проба на {ip} {probe}')  #
     # пресентс <-
     presence = get_message(socket)
     logger.info(f'получен презентс-сообщение от {ip}  {presence}')  #
     # пресентс <!>
     cod = self.control_presence(presence=presence, ip=ip)
     # респонс ->
     response = self.create_response(cod)
     send_message(socket, response)
     logger.info(f'отправлен ответ на презентс {ip}  {response}')  #
示例#7
0
    def write_responses(self, messages, w_clients, all_clients):
        for sock in w_clients:
            # Будем отправлять каждое сообщение всем
            for message, sock_send in messages:
                try:
                    ip = self.sock_ip[sock]
                    name = self.sock_login[ip]
                    action = message['action']
                    if action == 'msg':
                        if sock != sock_send:  # broadcast send ===========>
                            send_message(sock, message)
                            logger.info(
                                f'сообщение отправленно {message} на сокет {sock}'
                            )  #
                    elif action == 'quit':
                        logger.info(
                            f'полученно уведомление о выходе от {name} от сокета {sock}'
                        )  #
                        if sock != sock_send:  # broadcast send ===========>
                            send_message(sock, message)
                            logger.info(
                                f'отправленно уведомление о выходе {name} на сокет {sock}'
                            )  #
                        else:  # отправка ответа на запрос
                            # добавить запись в таблицу History
                            self.base_handler.save_history(msg=message, ip=ip)
                            response = self.create_response(cod=202)
                            # unicast send ----------->
                            send_message(sock_send, response)
                            logger.info(
                                f'отправлен ответ на запрос {message} на сокет {sock}'
                            )  #
                    elif action == 'get_contacts' and sock == sock_send:
                        logger.info(
                            f'получен запрос на список контактов от сокета {sock}'
                        )  #
                        contacts = self.base_handler.get_contacts_list(name)
                        response = self.create_response(cod=200,
                                                        alert=contacts)
                        # unicast send ------------>
                        send_message(sock_send, response)
                        logger.info(
                            f'отправлен ответ на запрос {message} на сокет {sock}'
                        )  #
                    elif action == 'add_contact' and sock == sock_send:
                        logger.info(
                            f'получен запрос на добавление контакта от сокета {sock}'
                        )  #
                        print(name, message)
                        cod = self.create_new_contact(msg=message, name=name)
                        response = self.create_response(cod=cod)
                        # unicast send ------------>
                        send_message(sock_send, response)
                        logger.info(
                            f'отправлен ответ на запрос {message} на сокет {sock}'
                        )  #
                    elif action == 'del_contact' and sock == sock_send:
                        logger.info(
                            f'получен запрос на добавление контакта от сокета {sock}'
                        )  #
                        print(name, message)
                        cod = self.create_del_contact(msg=message, name=name)
                        response = self.create_response(cod=cod)
                        # unicast send ------------>
                        send_message(sock_send, response)
                        logger.info(
                            f'отправлен ответ на запрос {message} на сокет {sock}'
                        )  #

                except:  # Сокет недоступен, клиент отключился
                    print(
                        f'Клиент {sock.fileno()} {sock.getpeername()} отключился'
                    )
                    sock.close()
                    all_clients.remove(sock)