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)
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
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)
def message_send(self, msg_to, text): msg = self.prepare_message(MSG, msg_to, text) send_message(self.sock, msg) return msg
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
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]
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)