Пример #1
0
def in_client():
    try:
        client.login = in_window.LogLogin.text()
        client.password = in_window.LogPassw.text()
        mes = client.get_passw()
        send_message(client.sock, mes)
        resp = get_message(client.sock)
        if resp[RESPONSE] == OK:
            code = client.sock.recv(32)
            messege = client.hash_resp(code)
            client.sock.send(messege)
            responce = get_message(client.sock)
            responce = client.translate_response(responce)
            if responce[RESPONSE] == OK:
                in_window.LogText.addItem("You're welcome")
                print(1)
                open_chat()
                print(2)
                in_window.close()
            else:
                in_window.LogText.addItem("Wrong password")
        else:
            in_window.LogText.addItem("Wrong login")
    except Exception as e:
        window.CrText.addItem(e)
Пример #2
0
 def get_client_contacts(self):
     get_contacts_msg = JIMMsg(action='get_contacts').msg
     utils.send_message(self.client.s, get_contacts_msg)
     accept = utils.get_message(self.client.s)
     contacts = utils.get_message(self.client.s)['message']
     # if accept['quantity']:
     #    print('Ваши контакты: ')
     #    for i in range(accept['quantity']):
     #        print(utils.get_message(self.client.s)['user']['account_name'])
     return contacts
Пример #3
0
    def write_messages(self, service):
        """Клиент пишет сообщение в бесконечном цикле"""
        while True:
            # Вводим сообщение с клавиатуры
            text = input(':)>')
            if text.startswith('list'):
                # запрос на список контактов
                jimmessage = JimGetContacts(self.login)
                # отправляем

                send_message(service, jimmessage.to_dict())
                # получаем ответ
                response = get_message(service)

                # приводим ответ к ответу сервера
                response = Jim.from_dict(response)
                # там лежит количество контактов
                quantity = response.quantity
                # делаем цикл и получаем каждый контакт по отдельности
                print('У вас ', quantity, 'друзей')
                print('Вот они:')
                for i in range(quantity):
                    message = get_message(service)
                    message = Jim.from_dict(message)
                    print(message.user_id)
            else:
                command, param = text.split()
                if command == 'add':
                    # будем добавлять контакт
                    message = JimAddContact(self.login, param)
                    send_message(service, message.to_dict())
                    # получаем ответ от сервера
                    response = get_message(service)
                    response = Jim.from_dict(response)
                    if response.response == ACCEPTED:
                        print('Контакт успешно добавлен')
                    else:
                        print(response.error)
                elif command == 'del':
                    # будем удалять контакт
                    message = JimDelContact(self.login, param)
                    send_message(service, message.to_dict())
                    # получаем ответ от сервера
                    response = get_message(service)
                    response = Jim.from_dict(response)
                    if response.response == ACCEPTED:
                        print('Контакт успешно удален')
                    else:
                        print(response.error)
Пример #4
0
    def listen_forever(self):
        self.sock_server.listen(15)
        self.sock_server.settimeout(0.2)

        while True:
            try:
                conn, addr = self.sock_server.accept(
                )  # Принять запрос на соединение
                presence = get_message(conn)
                print('<presence>:', presence)
                responce = presence_response(presence)
                send_message(conn, responce)
            except OSError as e:
                pass
            else:
                print('Получен запрос на соеденение: %s' % str(addr))
                self.clients.append(conn)
                print('<client_list>:', self.clients)
            finally:
                # Проверить наличие событий ввода-вывода
                wait = 0
                r = []
                w = []
                try:
                    r, w, e = select.select(self.clients, self.clients, [],
                                            wait)
                except:
                    pass  # Ничего не делать, если какой-то клиент отключился

                requests = self.handler.read_requests(
                    r, self.clients)  # Получаем входные сообщения
                self.handler.write_responses(
                    requests, w,
                    self.clients)  # Выполним отправку входящих сообщений
Пример #5
0
def read_requests(r_clients, all_clients):
    """
    Чтение сообщений, которые будут посылать клиенты
    :param r_clients: клиенты которые могут отправлять сообщения
    :param all_clients: все клиенты
    :return:
    """
    # Список входящих сообщений
    messages = []

    for sock in r_clients:
        try:
            # Получаем входящие сообщения
            message = get_message(sock)
            print(message)
            # Добавляем их в список
            # В идеале нам нужно сделать еще проверку, что сообщение нужного формата прежде чем его пересылать!
            # Пока оставим как есть, этим займемся позже
            messages.append((message, sock))
        except:
            print('Клиент {} {} отключился'.format(sock.fileno(),
                                                   sock.getpeername()))
            all_clients.remove(sock)

    # Возвращаем словарь сообщений
    return messages
Пример #6
0
 def message_from_server(sock, my_username):
     """
     Метод-обработчик сообщений других пользователей, поступающих от сервера
     :param sock: socket (Сокет с сообщением)
     :param my_username: str (Имя клиента, для которого сообщение)
     :return: None
     """
     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'[Сообщение от "{message[SENDER]}"]:\n'
                       f'{message[MESSAGE_TEXT]}')
                 client_logger.info(
                     f'Получено сообщение от пользователя {message[SENDER]}:\n'
                     f'{message[MESSAGE_TEXT]}')
             else:
                 client_logger.error(
                     f'Получено некорректное сообщение от сервера:\n{message}'
                 )
         except IncorrectDataReceivedError:
             client_logger.error(
                 'Не удалось декодировать полученное сообщение')
         except (OSError, ConnectionError, ConnectionAbortedError,
                 ConnectionResetError, json.JSONDecodeError):
             client_logger.critical(f'Потеряно соединение с сервером')
             break
def test_get_message(monkeypatch):
    # подменяем настоящий сокет нашим классом заглушкой
    monkeypatch.setattr("socket.socket", ClientSocket)
    # зоздаем сокет, он уже был подменен
    sock = socket.socket()
    # теперь можем протестировать работу метода
    assert get_message(sock) == {'response': 200}
Пример #8
0
    def poll(self):
        self.is_alive = True
        while True:
            if not self.is_alive:
                break
            data = get_message(self.sock)
            try:
                # Преобразуем словарь в Jim, Это может быть action, а может быть response
                jm = Jim.from_dict(data)

                # Если это сообщение
                if isinstance(jm, JimMessage):
                    self.process_message(jm)
                elif isinstance(jm, JimPicture):
                    self.process_pictures(jm)
                elif isinstance(jm, JimSendProfile):
                    self.process_profiles(jm)
                else:
                    # Это либо ответ от сервера либо действия с контактами
                    # мы это складываем в очередь
                    self.request_queue.put(jm)
            except Exception as e:
                # Ошбики быть не должно так как сервер отправлять верные данные
                # но лучше этот случай все равно обработать
                # выведем ошибку, но лучше писать в будующем в log
                print(e)
Пример #9
0
    def connect(self):
        # Соединиться с сервером
        try:
            #self.sock = socket(AF_INET, SOCK_STREAM)
            #self.sock = ssl.wrap_socket(socket(AF_INET, SOCK_STREAM), 'server.key', 'server.crt', True)
            self.sock = socket(AF_INET, SOCK_STREAM)
            self.sock = ssl.wrap_socket(self.sock,
                                        ssl_version=ssl.PROTOCOL_SSLv3)

            self.sock.connect((self.addr, self.port))
            # Аутентификация на сервере
            client_authenticate(self.sock, secret_key)
            # Создаем сообщение
            presence = self.create_presence()
            # Отсылаем сообщение
            print(send_message(self.sock, presence))
            # Получаем ответ
            response = get_message(self.sock)
            # Проверяем ответ
            response = self.translate_response(response)
            print("Ответ сервера: ", response)
            return response
        except ConnectionRefusedError as e:
            print(e)
            raise e
        except Exception as e:
            print("Ошибка в функции connect:", e)
Пример #10
0
 def send_get(self, message):
     try:
         send_message(self.sock, message)
         resp = get_message(self.sock)
         # resp = self.translate_message(resp)
         print('Ответ сервера: ', resp)
         return resp
     except Exception as e:
         print(e)
Пример #11
0
def read_messages(client, account_name):
    """
    Клиент читает входящие сообщения в бесконечном цикле
    :param client: сокет клиента
    """
    while True:
        # читаем сообщение
        message = get_message(client)
        print(message['message'])
Пример #12
0
 def log_in(self):
     while True:
         self.login = input('login')
         self.password = input('password')
         mes = self.get_passw()
         print(mes)
         send_message(self.sock, mes)
         resp = get_message(self.sock)
         if resp[RESPONSE] == OK:
             code = self.sock.recv(32)
             messege = self.hash_resp(code)
             self.sock.send(messege)
             responce = get_message(self.sock)
             responce = self.translate_response(responce)
             if responce[RESPONSE] == OK:
                 print('ok')
                 break
         else:
             print(resp[RESPONSE])
Пример #13
0
    def mainloop(self):
        """
        Основной цикл обработки запросов клиентов
        :return:
        """
        try:
            while True:
                try:
                    # Принимаю соединения
                    client, address = self._sock.accept()
                    # accept() - блокирует приложение до тех пор, пока не придет сообщение от клиента.
                    # Функция возвращает кортеж из двух параметров – объект самого соединения и адрес клиента.
                    # Сохраняю адрес клиента для протоколов идентификации
                    self.client_info = address
                except OSError as e:
                    pass
                else:
                    print("Получен запрос на соединение от {}".format(address))
                    # Принимаю сообщение о присутствии от клиента
                    presence = get_message(client)
                    # публикую в консоль сервера данные о присутствии клиента
                    print(self.past_time_to_dict(presence))
                    # Формирую ответ-подтвердение регистрации присутствия клиента
                    response = self.presence_response(presence)
                    # Отправляю ответ клиенту
                    send_message(client, response)
                    # добавляю информацию о присоединевшемся клиента в список
                    self._clients.append(client)
                finally:
                    # Список read-клиентов
                    r = []
                    # Список write-клиентов
                    w = []
                    try:
                        # Функция опроса устройств
                        r, w, e = select.select(self._clients, self._clients,
                                                [], 0)
                    except Exception as e:
                        pass
                    # проверка списка читающих клиентов
                    for client in r:
                        # от появившихся принять сообщение и сохранить на сервере
                        self.read(client)
                    # Если есть сохраненные сообщения
                    if self._requests:
                        # collections.popleft() - удаляет и возвращает первый элемент очереди
                        requests = self._requests.popleft()
                        # проверка списка пишущих клиентов
                        for client in w:
                            # всем в списке разослать сохраненное сообщение
                            self.write(client, requests)

        except KeyboardInterrupt:
            pass
Пример #14
0
 def read_messages(self, service):
     """
     Клиент читает входящие сообщения в бесконечном цикле
     :param client: сокет клиента
     """
     while True:
         # читаем сообщение
         print('Читаю')
         message = get_message(service)
         print(message)
         # там должно быть сообщение всем
         print(message[MESSAGE])
Пример #15
0
 async def read_requests(self, writers, clients):
     responses = []
     for sock in writers:
         try:
             messege = get_message(sock)
             responses.append((messege, sock))
         except:
             text = 'Клиент {} {} отключился'.format(
                 sock.fileno(), sock.getpeername())
             self.set_text(text)
             clients.remove(sock)
     return responses
Пример #16
0
 def get_contacts(self):
     message = {
         ACTION: 'get_contacts',
         TIME: time.time(),
         ACCOUNT_NAME: self.login
     }
     rsp = self.send_get(message)
     print('У вас : ', rsp['quantity'], 'контактов!')
     print('Ваши контакты: ')
     contacts = get_message(self.sock)
     print(contacts['user_id'])
     return contacts['user_id']
Пример #17
0
 def read(self):
     """
     чтение сообщений
     :return:
     """
     try:
         while True:
             # получаем сообщение сервера от пишущего клиента
             message = get_message(self.sock)
             # публикуем сообщение в консоли читающего клиента
             print(message[cfg.TIME], message[cfg.MESSAGE])
     except KeyboardInterrupt:
         pass
Пример #18
0
 def read_messages(self):
     while True:
         message = get_message(self.sock)
         try:
             if FROM in message:
                 print('{}:{}'.format(message[FROM], message[MESSAGE]))
             elif RESPONSE in message:
                 print(message[RESPONSE])
             elif CONTACT_LIST in message:
                 self.contacts.append(message[CONTACT_LIST])
                 print(message[CONTACT_LIST])
         except:
             print(message)
Пример #19
0
 def send_person(self):
     while True:
         self.create_person()
         presence = self.create_presence()
         send_message(self.sock, presence)
         responce = get_message(self.sock)
         responce = self.translate_response(responce)
         if responce['response'] == OK:
             print('профиль добавлен')
             break
         elif responce['response'] == ACCOUNT_ERROR:
             print('Такой пользователь уже есть')
         else:
             print(responce)
Пример #20
0
 def read_requests(self, r_clients, all_clients):
     ''' Чтение запросов из списка клиентов
     '''
     messages = []
     for sock in r_clients:
         try:
             message = get_message(sock)
             messages.append((message, sock))
         except:
             print('Клиент {} {} отключился'.format(sock.fileno(),
                                                    sock.getpeername()))
             all_clients.remove(sock)
     # print(messages)
     return messages
Пример #21
0
    def read_requests(self, r_clients, all_clients):

        messages = []

        for sock in r_clients:
            try:
                message = get_message(sock)
                #
                messages.append(message)
            except:
                print('Клиент {} {} отключился'.format(sock.fileno(),
                                                       sock.getpeername()))
                all_clients.remove(sock)

        return messages
Пример #22
0
 def poll(self):
     self.is_alive = True
     while True:
         if not self.is_alive:
             break
         message = get_message(self.sock)
         print(message)
         try:
             if ACTION in message:
                 # print("\n>>", message)
                 # print('{} >> {}'.format(message[FROM], message[MESSAGE]))
                 self.process_message(message)
             else:
                 self.request_queue.put(message)
         except Exception as e:
             print(e)
Пример #23
0
    def listen_forever(self):
        # запускаем цикл обработки событиц много клиентов
        self.sock.listen(15)
        self.sock.settimeout(0.2)
        print('Сервер запущен')

        while True:
            try:
                conn, addr = self.sock.accept()  # Проверка подключений
                # Аутентификация клиента
                if not server_authenticate(conn, secret_key):
                    # Если не наш то закрываем соединение
                    conn.close()
                    return
                else:
                    # получаем сообщение от клиента
                    presence = get_message(conn)
                    print("presence сообщение: ", presence)
                    # формируем ответ
                    response, client_name = self.handler.presence_response(
                        presence, conn)
                    # отправляем ответ клиенту
                    send_message(conn, response)
            except OSError as e:
                pass  # timeout вышел
            else:
                print("Получен запрос на соединение от %s" % str(addr))
                # Добавляем клиента в список
                self.clients.append(conn)
                self.names[client_name] = conn
                print('Подключился {}'.format(client_name))
            finally:
                # Проверить наличие событий ввода-вывода
                wait = 0
                r = []
                w = []
                try:
                    r, w, e = select.select(self.clients, self.clients, [],
                                            wait)
                except:
                    pass  # Ничего не делать, если какой-то клиент отключился
                requests = self.handler.read_requests(
                    r, self.clients)  # Получаем входные сообщения
                self.handler.write_responses(
                    requests, self.names,
                    self.clients)  # Выполним отправку входящих сообщений
Пример #24
0
def send_client():
    try:
        presence = client.create_presence()
        send_message(client.sock, presence)
        responce = get_message(client.sock)
        responce = client.translate_response(responce)
        if responce['response'] == OK:
            error ='Accept'
            open_chat()
            in_window.close()
        elif responce['response'] == ACCOUNT_ERROR:
            error ='This user name already exist'
        else:
            error = responce
        in_window.CrText.addItem(error)
    except Exception as e:
        in_window.CrText.addItem(e)
 def poll(self):
     self.is_alive = True
     while True:
         if not self.is_alive:
             break
         data = get_message(self.sock)
         #print("Пришли данные: ", data)
         try:
             jm = Jim.from_dict(data)
             if isinstance(jm, JimMessage):
                 self.process_message(jm)
             if isinstance(jm, JimMessageCrypto):
                 self.process_crypto(jm)
             else:
                 self.request_queue.put(jm)
         except TypeError as e:
             print("Ошибка TypeError в функции Receiver.poll:", e)
         except Exception as e:
             print("Ошибка в функции Receiver.poll:", e)
Пример #26
0
 def read(self, client):
     """
     Метод получает сообщение write-клиента и сохраняет в _requests
     :param client: сокет клиента
     :return: выводит в консоль информацию Кто, Когда и Что отправил
     """
     try:
         # Получаю сообщение от клиента
         message = get_message(client)
         # Сохраняю сообщение в список
         self._requests.append(message)
         # Печатаю информацию в консоль сервера
         print('[i] Сообщение от: {0}'
               '\n=== Обработанно на сервере: {1}'
               '\n=== Текст сообщения: {2}'.format(self.client_info, \
                                              message[cfg.TIME], \
                                              message[cfg.MESSAGE]))
     # При разрыве соединения с клиентом исключить из общего списка
     except (ConnectionResetError, BrokenPipeError):
         if client in self._clients:
             self._clients.remove(client)
Пример #27
0
    def listen_forever(self):
        # запускаем цикл обработки событиц много клиентов
        self.sock.listen(15)
        self.sock.settimeout(0.2)

        while True:
            try:
                conn, addr = self.sock.accept()  # Проверка подключений
                # получаем сообщение от клиента
                presence = get_message(conn)
                # формируем ответ
                response, client_name = self.handler.presence_response(presence)
                # отправляем ответ клиенту
                send_message(conn, response)
            except OSError as e:
                pass  # timeout вышел
            else:
                print("Получен запрос на соединение от %s" % str(addr))
                # Добавляем клиента в список
                self.clients.append(conn)
                # нам надо связать имя клиента и его сокет
                self.names[client_name] = conn
                # проверим кто к нам подключился
                print('К нам подключился {}'.format(client_name))
            finally:
                # Проверить наличие событий ввода-вывода
                wait = 0
                r = []
                w = []
                try:
                    r, w, e = select.select(self.clients, self.clients, [], wait)
                except:
                    pass  # Ничего не делать, если какой-то клиент отключился

                requests = self.handler.read_requests(r, self.clients)  # Получаем входные сообщения
                self.handler.write_responses(requests, self.names, self.clients)  # Выполним отправку входящих сообщений
Пример #28
0
 def mainloop(self):
     """
     основной цикл взаимодействия клиентов с сервером
     :return:
     """
     # формирую сообщение присутствия
     message = self.presence_message()
     # отправляюсообщение присутствия
     send_message(self.sock, message)
     while True:
         # принимаю сообщение-ответ сервера
         tm = get_message(self.sock)
         # публикую сообщение-ответ сервера
         print(self.decode_message(tm))
         # Смотрим ключ запуска клиента
         if self.type_clients() == '-r':
             # запускаем клиент на прием сообщений в чате
             self.read()
         elif self.type_clients() == '-w':
             # запускаем клиент на отправку сообщений в чате
             self.write()
         else:
             pass
     self.sock.close()
Пример #29
0
from jim.utils import send_message, get_message
from server.functions import *

if __name__ == '__main__':
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        addr = sys.argv[1]
    except IndexError:
        addr = ''

    try:
        port = int(sys.argv[2])
    except IndexError:
        port = 7777
    except ValueError:
        print('Порт должен быть целым числом')
        sys.exit(0)

    server.bind((addr, port))
    server.listen(5)
    while True:
        client, addr = server.accept()

        presence = get_message(client)
        print(presence)

        response = presence_response(presence)
        send_message(client, response)

        client.close()
Пример #30
0
    #------------ip-адрес-----------#
    # если ip-адрес указан в параметрах -p <addr>
    try:
        addr = sys.argv[1]
    # если ip-адрес не указан в параметрах
    except IndexError:
        addr = 'localhost'
    #--------------порт-------------#
    # если порт указан в параметрах
    try:
        port = int(sys.argv[2])
    # если порт не указан в параметрах
    except IndexError:
        port = 7777
    # если порт - не целое число
    except ValueError:
        print('Порт должен быть целым числом')
        sys.exit(0)
    # ДАННЫЕ ПОЛУЧИЛИ -> СОЕДИНЯЕМСЯ С СЕРВЕРОМ
    # Соединиться с сервером
    client.connect((addr, port))
    # Сформировать сообщение серверу
    presence = create_presence()
    # Отправить сообщение серверу
    send_message(client, presence)
    # Получить ответ сервера
    response = get_message(client)
    # Разобрать ответ сервера
    response = translate_message(response)
    print(response)