def authentication_and_create_handler(self, conn, next_id=None): # принимает один байт для подтверждения # отправляет следующий номер либо из генератора id_clients, либо из id_PP bytes_message = conn.recv(cnf.SIZE_HEADER) if not bytes_message: print("disconnect") return False try: message = cnf.to_data_message_from_bytes_2(bytes_message) except: return False if message.cmd: print("пришло что-то странное.... ") print(message) return False elif message.cmd == CMD.NEW_CLIENT: # заглушка, замена аутотификации на сервере. Не забыть изменить!!! print("Client!") next_id = self.id_clients.next() self.create_client_handler(conn, next_id) elif message.cmd == CMD.NEW_PP: print('PP') next_id = self.id_PP.next() self.create_PP_handler(conn, next_id) answer = cnf.ntuple_data_message(0, CMD.GET_SELF_ID, self.self_ID, message.sender, 0, next_id) bytes_answer = cnf.to_bytes_from_data_message_2(answer) conn.send(bytes_answer) # TODO !!! ВНИМАНИЕ!!! return True
def main(): TCP_IP = cnf.server_address TCP_PORT = cnf.PORT sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((TCP_IP, TCP_PORT)) cmd = CMD.NEW_PP sender = 0 receiver = 100 # id сервера data = 0 size_next = 0 msg = cnf.ntuple_data_message(0, cmd, sender, receiver, size_next, data) mess = cnf.to_bytes_from_data_message(msg) if not sock.send(mess): return answer = sock.recv(cnf.SIZE_HEADER) if not answer: print("нет ответа") return message = cnf.to_data_message_from_bytes_(answer) self_id = message.data while 1: receiver = input("Продолжить, получатель?\n") id_ = msg.id + 1 msg = cnf.ntuple_data_message(id_, CMD.ON_LIGHT, self_id, receiver, msg.size_next, msg.data) mess = cnf.to_bytes_from_data_message(msg) sock.send(mess) tmp = sock.recv(cnf.SIZE_HEADER) or None if not tmp: sock.close() return answer = sock.recv(24) if not answer: sock.close() return answer_ = cnf.to_data_message_from_bytes_(answer) print("received ->" + str(answer_))
def _add_datas_in_packet(self, data): if not data: data_to_str = '' else: data_to_str = ''.join(data) # преобразование списка в строку self.packet = self.packet._replace(data=(str(self.packet.data) + data_to_str)) self.packet = cnf.ntuple_data_message( self.packet.id, self.packet.cmd, self.packet.sender, self.packet.recv, self.packet.size_next, str(self.packet.data) + data_to_str )
def parse_message(self, mess): """ аналог функции from_bytes_to_data_mesage(), только разбивает байты не используется :param mess: bytes :return: ntuple_data_message, size_next_mess """ id_ = int(mess[cnf.id_slise]) cmd = int(mess[cnf.cmd_slice]) sender = int(mess[cnf.sender_slice]) receiver = int(mess[cnf.receiver_slice]) size_next_mess = int(mess[cnf.size_next_mess_slice]) data = int(mess[cnf.data_slice]) return cnf.ntuple_data_message(id_, cmd, sender, receiver, data, size_next_mess), size_next_mess