示例#1
0
    def listen_forever(self):
        self.sock.listen(15)
        self.sock.settimeout(0.2)
        print('Сервер запущен')

        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
            else:
                print('Получен запрос на соединение от {}'.format(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)
示例#2
0
 def del_contact(self, username):
     # будем удалять контакт
     message = JimDelContact(self.login, username)
     send_message(self.sock, message.to_dict())
     # получаем ответ от сервера
     # response = get_message(self.sock)
     # response = Jim.from_dict(response)
     response = self.request_queue.get()
     return response
示例#3
0
 def connect(self):
     # Соединиться с сервером
     self.sock = socket(AF_INET, SOCK_STREAM)
     self.sock.connect((self.addr, self.port))
     # Создаем сообщение
     presence = self.create_presence()
     # Отсылаем сообщение
     send_message(self.sock, presence)
     # Получаем ответ
     response = get_message(self.sock)
     # Проверяем ответ
     response = self.translate_response(response)
     return response
示例#4
0
    def get_contacts(self):
        # запрос на список контактов
        jimmessage = JimGetContacts(self.login)
        # отправляем

        send_message(self.sock, jimmessage.to_dict())
        # получаем ответ
        response = self.request_queue.get()

        # приводим ответ к ответу сервера
        # response = Jim.from_dict(response)
        quantity = response.quantity
        # получаем имена одним списком
        # читаем имена из очереди
        message = self.request_queue.get()
        # возвращаем список имен
        contacts = message.user_id
        return contacts
示例#5
0
 def send_message(self, to, text):
     message = JimMessage(to, self.login, text)
     send_message(self.sock,message.to_dict())
示例#6
0
    def write_responses(self, messages, names, all_clients):
        """
        Отправка сообщений тем клиентам, которые их ждут
        :param messages: список сообщений
        :param w_clients: клиенты которые читают
        :param all_clients: все клиенты
        :return:
        """

        for message, sock in messages:
            try:
                # теперь нам приходят разные сообщения, будем их обрабатывать
                action = Jim.from_dict(message)
                if action.action == GET_CONTACTS:
                    # нам нужен репозиторий
                    contacts = self.repo.get_contacts(action.account_name)
                    # формируем ответ
                    response = JimResponse(ACCEPTED, quantity=len(contacts))
                    # Отправляем
                    send_message(sock, response.to_dict())
                    # в цикле по контактам шлем сообщения
                    # for contact in contacts:
                    #     message = JimContactList(contact.Name)
                    #     print(message.to_dict())
                    #     send_message(sock, message.to_dict())
                    contact_names = [contact.Name for contact in contacts]
                    message = JimContactList(contact_names)
                    send_message(sock, message.to_dict())
                elif action.action == ADD_CONTACT:
                    user_id = action.user_id
                    username = action.account_name
                    try:
                        self.repo.add_contact(username, user_id)
                        # формируем удачный ответ
                        response = JimResponse(ACCEPTED)
                        # Отправляем
                        send_message(sock, response.to_dict())
                    except ContactDoesNotExist as e:
                        # формируем ошибку, такого контакта нет
                        response = JimResponse(WRONG_REQUEST, error='Такого контакта нет')
                        # Отправляем
                        send_message(sock, response.to_dict())
                elif action.action == DEL_CONTACT:
                    user_id = action.user_id
                    username = action.account_name
                    try:
                        self.repo.del_contact(username, user_id)
                        # формируем удачный ответ
                        response = JimResponse(ACCEPTED)
                        # Отправляем
                        send_message(sock, response.to_dict())
                    except ContactDoesNotExist as e:
                        # формируем ошибку, такого контакта нет
                        response = JimResponse(WRONG_REQUEST, error='Такого контакта нет')
                        # Отправляем
                        send_message(sock, response.to_dict())
                elif action.action == MSG:
                    to = action.to
                    client_sock = names[to]
                    send_message(client_sock, action.to_dict())
            except WrongInputError as e:
                # Отправляем ошибку и текст из ошибки
                response = JimResponse(WRONG_REQUEST, error=str(e))
                send_message(sock, response.to_dict())
            except:  # Сокет недоступен, клиент отключился
                print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername()))
                sock.close()
                all_clients.remove(sock)