Exemple #1
0
    def start(self):
        print('Эхо-сервер запущен...')
        while True:
            try:
                conn, adr = self.sock.accept()
                presence = get_message(conn)
                response, name = self.handler.greet(presence)
                send_message(conn, response)
            except OSError:
                # Время ожидания вышло
                pass
            else:
                print('Получен запрос на соединение от {}'.format(adr))
                # Клиент подключился - добавляем его в список
                self.clients.append(conn)
                # Связываем имя клиента и его сокет
                self.names[name] = conn
            finally:
                timeout = 0
                r = []
                w = []
                try:
                    # Опрос сокетов, которые подключились
                    # r - сокеты, которые отправляеют сообщения
                    # w - сокеты, которые ожидают ответ
                    # e -  сокеты с ошибкой
                    r, w, e = select(self.clients, self.clients, [], timeout)
                except:
                    # Клиент отключился - ничего не делать
                    pass

                requests = self.handler.request(r, self.clients)
                self.handler.response(requests, self.names, self.clients)
Exemple #2
0
 def start(self):
     self.sock = socket(AF_INET, SOCK_STREAM)
     self.sock.connect(self.host)
     send_message(self.sock, self.presence())
     response_msg = get_message(self.sock)
     result_response = Jim.from_dict(response_msg)
     return result_response
Exemple #3
0
 def pull(self):
     self.is_alive = True
     while True:
         if not self.is_alive:
             break
         # Получаем запрос/сообщение из очереди
         data = self.sender_queue.get()
         if isinstance(data, dict):
             # Отправляем на сервер
             send_message(self.sock, data)
Exemple #4
0
 def message_send(self, msg_to, text):
     msg = self.prepare_message(MSG, msg_to, text)
     send_message(self.sock, msg)
     return msg
Exemple #5
0
 def del_contact(self, contact_name):
     msg = JimDelContact(self.login, contact_name)
     send_message(self.sock, msg.to_dict())
     # response = get_message(self.sock)
     response = self.receiver_queue.get()
     return response
Exemple #6
0
 def get_contacts(self):
     msg = JimGetContacts(self.login)
     send_message(self.sock, msg.to_dict())
     response = get_message(self.sock)
     # response = self.receiver_queue.get()
     return response[MESSAGE]
Exemple #7
0
 def response(self, messages, names, all_clients):
     """
     Эхо-ответ сервера клиентам, от которых были запросы
     :param messages: {сокет: запрос}
     :param names: список клиентов и их сокетов, которые ожидают ответа
     :param all_clientts: список всех клиентов
     :return: None
     """
     for msg, sock in messages:
         try:
             # Получаем словарь
             jmsg = Jim.from_dict(msg)
             if jmsg[ACTION] == MSG:
                 to = jmsg[TO]
                 # Проверяем подключен ли адресат
                 if to in names:
                     # Достаем из словаря сокет по имени клиента
                     contact_sock = names[to]
                     send_message(contact_sock, msg)
                 else:
                     # Если контакт offline шлем ответ сервера
                     resp = JimResponse(GONE,
                                        error='{} не в сети'.format(to))
                     send_message(sock, resp.to_dict())
             elif jmsg[ACTION] == GET_CONTACTS:
                 # Извлекаем имя пользователя и передаем в запрос
                 contacts = self.repo.get_contacts(jmsg[USER])
                 # Получаем контакты и заносим в список
                 contact_names = [contact.name for contact in contacts]
                 # Все ОК, формируем ответ (список контактов помещаем в поле для сообщений) и отправляем
                 resp = JimResponse(OK, contact_names)
                 send_message(sock, resp.to_dict())
             elif jmsg[ACTION] == ADD_CONTACT:
                 # Извлекам пользователя и контакт
                 user_name = jmsg[USER]
                 contact_name = jmsg[TO]
                 try:
                     if not self.repo.contact_exist(user_name,
                                                    contact_name):
                         # Добавляем в друзья пользователю контакт
                         self.repo.add_contact(user_name, contact_name)
                         # Все ОК, формируем ответ и отправляем
                         resp = JimResponse(ACCEPTED, 'Контакт добавлен')
                         send_message(sock, resp.to_dict())
                     else:
                         resp = JimResponse(WRONG_REQUEST,
                                            error='Контакт уже добавлен')
                         send_message(sock, resp.to_dict())
                 except UserDoesNotExist as e:
                     resp = JimResponse(WRONG_REQUEST,
                                        error='Контакт отсутствует')
                     send_message(sock, resp.to_dict())
             elif jmsg[ACTION] == DEL_CONTACT:
                 # Извлекам пользователя и контакт
                 user_name = jmsg[USER]
                 contact_name = jmsg[TO]
                 try:
                     # Удаляем контакт из друзей пользователя
                     self.repo.del_contact(user_name, contact_name)
                     # Все ОК, формируем ответ и отправляем
                     resp = JimResponse(ACCEPTED, 'Контакт удален')
                     send_message(sock, resp.to_dict())
                 except UserDoesNotExist as e:
                     # Контакта нет, вызываем исключение
                     resp = JimResponse(WRONG_REQUEST,
                                        error='Контакт отсутствует')
                     send_message(sock, resp.to_dict())
         except:
             # Сокет недоступен, клиент отключился
             print('Клиент {} {} отключился'.format(sock.fileno(),
                                                    sock.getpeername()))
             sock.close()
             all_clients.remove(sock)