diff --git a/recv/recv_net.py b/recv/recv_net.py index 3871f71..7585720 100644 --- a/recv/recv_net.py +++ b/recv/recv_net.py @@ -1,34 +1,12 @@ -import hashlib import json -import queue -import selectors import socket import threading from time import sleep - -import select - from entity.Letter import Letter, json_to_obj import recv from sender import sender - -# from entity.Letter import Letter - - -# def main(): -# # 用户输入各种数据填充letter字段 -# # 获取用户的公私钥对进行签名 -# # 使用对方的公钥进行加密 -# # 发送信件 -# pass -# -# -# def sendLetter(letter: Letter, target="192.168.195.162:8426"): -# # 向目标ip和端口发送指定的信件 -# pass - -class recver_net(): +class RecverNet: def __init__(self, port, client_host, client_port): self.client_host = client_host self.client_port = client_port @@ -37,149 +15,114 @@ class recver_net(): self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind(('0.0.0.0', self.port)) self.server.listen(10) - self.result_queue = queue.Queue() - self.FLAG = 0 + self.is_running = True + def recver_thread(self): - while True: - if self.FLAG == 0: - try: - conn, addr = self.server.accept() - data = conn.recv(10240) - msg = json.loads(data.decode()) - if int(msg['flag']) == 0: - print("[+] haved received data:" + msg["data"]) - elif int(msg['flag']) == 1: - self.recv_file(msg['data']) - else: - print("[x] Error") - except : - print("[x] Error") - self.FLAG = 1 - return - else: - print("[x] loss connection with client,exiting...") - return + while self.is_running: + try: + conn, addr = self.server.accept() + print(f"\n[*] Connection from {addr}") + with conn: + while self.is_running: + data = conn.recv(10240) + if not data: + print("\n[x] Disconnected from client.") + break + msg = json.loads(data.decode()) + self.handle_message(msg) + except Exception as e: + print(f"\n[x] Error in recver_thread: {e}") + + def handle_message(self, msg): + if msg['flag'] == 0: + print("\n[+] Received data:", msg["data"]) + elif msg['flag'] == 1: + self.recv_file(msg['data']) + else: + print("\n[x] Error: Unknown flag") def send_thread(self, conn): - while True: - if self.FLAG == 0: - try: - flag = input() - if flag == "0": - data = input("[-] Enter data to send: ") - msg = {"flag": 0, "data": data} - msg = json.dumps(msg).encode("utf-8") - self.send_data(conn, msg) - elif flag == "1": - print("[+] Calling file transfer module...") - # file_name = input("Enter file name to send: ") - self.send_file(conn) - else: - print("[x] Error,plesae enter 0 to send data, or 1 to send file.") - except: - print("[x] Error,远程主机已将连接断开。正在尝试重连...") - self.FLAG = 1 - return - else: - print("[x] lose connection with client,exiting...") - conn.close() - return - + while self.is_running: + try: + flag = input("[*] Enter 0 to send data, 1 to send file: ") + if flag == "0": + data = input("[-] Enter data to send: ") + msg = {"flag": 0, "data": data} + self.send_data(conn, msg) + elif flag == "1": + print("[+] Calling file transfer module...") + self.send_file(conn) + else: + print("[x] Invalid input. Please enter 0 or 1.") + except Exception as e: + print(f"[x] Error in send_thread: {e}") + self.is_running = False - def send_data(self, conn, data): - conn.sendall(data) + def send_data(self, conn, msg): + conn.sendall(json.dumps(msg).encode("utf-8")) def send_file(self, conn): - self.letter: Letter = sender.main() - letter = self.letter.to_dict() - msg = {"flag": 1, "data": letter} - msg = json.dumps(msg).encode("utf-8") - conn.sendall(msg) - - def recv_data(self, conn): - con, addr = conn.accept() - data = con.recv(1024) - if not data: - return None - # print(data.decode()) - return data.decode() + self.letter = sender.main() + letter_data = self.letter.to_dict() + msg = {"flag": 1, "data": letter_data} + self.send_data(conn, msg) def recv_file(self, data): - letter: Letter = json_to_obj(data) + letter = json_to_obj(data) recv.handleLetter(letter) def connect(self): while True: try: - client = socket.socket() # 定义协议类型,相当于生命socket类型,同时生成socket连接对象 + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((self.client_host, self.client_port)) - print("[*] Connected...") - print("[*] if you want to send data, enter 0, if you want to send file, enter 1.") - sleep(1) - break + return client except socket.error: - print("[*] Waiting for ...") - return client - def main(self): - - while True: - if self.FLAG == 0: - client = self.connect() - a = threading.Thread(target=self.recver_thread, ) - a.start() - b=threading.Thread(target=self.send_thread, args=(client,)) - b.start() - b.join() - elif self.FLAG == 1: - self.FLAG = 0 - - - - - # # 加入线程 - # if self.FLAG == 0: - # a=threading.Thread(target=self.recver_thread, ) - # b=threading.Thread(target=self.send_thread, args=(client,)) - # a.start() - # b.start() - # elif self.FLAG == 1: - # # 主动杀死线程a和b,且不等待完成直接杀死 - - - + print("[*] Connection failed. Retrying...") + sleep(2) + def main(self): + client = self.connect() + threading.Thread(target=self.recver_thread, daemon=True).start() + self.send_thread(client) + while self.is_running==False: + self.is_running=True + client=self.connect() + self.send_thread(client) + sleep(1) def run(self): - threading.Thread(target=self.main).start() + self.main() def input_verify(): while True: try: - port = int(input("[*] Enter to the listen port: ")) - break + port = int(input("[*] Enter the listen port: ")) + if 0 <= port <= 65535: + break + else: + print("[x] Port must be between 0 and 65535.") except ValueError: - print("[x] Error, please enter a valid port number.") + print("[x] Invalid port number. Please try again.") while True: - addr = input("[*] Enter the address to connect to(127.0.0.1:8424): ") + addr = input("[*] Enter the address to connect to (e.g., 127.0.0.1:8424): ") if ':' in addr: client_host, client_port = addr.split(":") if client_host and client_port.isdigit(): client_port = int(client_port) - if 0 <= client_port <= 65535: # 检查端口范围 - break # 输入有效,跳出循环 + if 0 <= client_port <= 65535: + return port, client_host, client_port else: - print("Port must be between 0 and 65535.") + print("[x] Port must be between 0 and 65535.") else: - print("Invalid address format. Please enter in the format 'host:port'.") + print("[x] Invalid address format.") else: - print("Invalid address format. Please enter in the format 'host:port'.") - return port, client_host, client_port - + print("[x] Invalid address format.") -# test +# Test if __name__ == '__main__': port, client_host, client_port = input_verify() - a = recver_net(port, client_host, client_port) - a.run() + recver_net = RecverNet(port, client_host, client_port) + recver_net.run() \ No newline at end of file