def _accept(self): conn = None try: conn, addr = self._receive_socket.accept() print(addr) with self.lock: info = Packet.parse(conn.recv(self.packet_size)) if info.type is PacketType.CONNECTION: conn.send(bytes(Packet(PacketType.CONFIRMATION))) time.sleep(2) # TODO info = Packet.parse(conn.recv(self.packet_size)) if info.type is PacketType.CONFIRMATION: self._connections.append(conn) new_reader = reader.Reader(conn, self.packet_size) self._readers.append(new_reader) new_reader.run() self.ip_list.add(addr[0] + ':' + info.data) self.send( Packet(PacketType.IP, '/' + addr[0] + ':' + info.data)) print('accepted') except OSError: if conn is not None: conn.close()
def _process(self, data: bytes): message = Packet.parse(data) if message.id in self.received: return self.received.add(message.id) if message.type is PacketType.MESSAGE or message.type is PacketType.ONLINE: self.got_messages.put(message) self.send(message) if message.type is PacketType.IP: cur_id, addr = message.data.split('/') self.ip_list.add(addr) self.send(message) if message.type is PacketType.GET_IP: self.send(message) for ip in self.ip_list: self.send( Packet(PacketType.IP, '{}/{}'.format(message.data, ip)))
def _connect(self, chat_host, chat_port: int): connection = socket.socket() connection.connect((chat_host, chat_port)) connection.send(bytes(Packet(PacketType.CONNECTION))) info = b'' while len(info) == 0: time.sleep(1) # TODO info = connection.recv(self.packet_size) info = Packet.parse(info) if info.type is PacketType.CONFIRMATION: self._connections.append(connection) connection.send( bytes(Packet(PacketType.CONFIRMATION, str(self._server_port)))) self._par_conn = connection print('connected') new_reader = reader.Reader(connection, self.packet_size) self._readers.append(new_reader) new_reader.run() self.ip_list.add(chat_host + ':' + str(chat_port)) time.sleep(1) # TODO question = Packet(PacketType.GET_IP) self.send(question) self.received.add(question.id) self._question_id = question.id