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)
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
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
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
def send_message(self, to, text): message = JimMessage(to, self.login, text) send_message(self.sock,message.to_dict())
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)