import ipaddress import json import socket import threading from time import sleep import senders.sender from entity.Letter import Letter, json_to_obj from recvs import recv # from entity.Letter import Letter # def main(): # # 用户输入各种数据填充letter字段 # # 获取用户的公私钥对进行签名 # # 使用对方的公钥进行加密 # # 发送信件 # pass # # # def sendLetter(letter: Letter, target="192.168.195.162:8426"): # # 向目标ip和端口发送指定的信件 # pass class sender_net(): def __init__(self, port=8424, client_host='127.0.0.1', client_port=8424): self.client_host = client_host self.client_port = client_port self.letter = Letter() self.port = port self.server = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) # 设置socket选项以允许IPv4映射到IPv6 self.server.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) self.server.bind(('::', self.port)) self.server.listen(10) def recver_thread(self): while True: 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") def send_thread(self, conn): while True: try: flag: int = int(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 ValueError: print("[x] Error, please enter a valid number.") def send_data(self, conn, msg): conn.sendall(msg) def send_file(self, conn): self.letter: Letter = senders.sender.main() letter = self.letter.to_dict() msg = {"flag": 1, "data": letter} print(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() def recv_file(self, data): letter: Letter = json_to_obj(data) recv.handleLetter(letter) def run(self): a = threading.Thread(target=self.main) a.start() a.join() def main(self): while True: try: client = socket.create_connection( (self.client_host, self.client_port)) # 定义协议类型,相当于生命socket类型,同时生成socket连接对象 print(" [*] Connected...") print("[*] if you want to send data, enter 0, if you want to send file, enter 1.") sleep(1) break except socket.error as e: print(e) print("[*] Waiting for ...") # 加入线程 a = threading.Thread(target=self.recver_thread, ) b = threading.Thread(target=self.send_thread, args=(client,)) a.start() b.start() a.join() b.join() def input_verify(): while True: try: port = int(input("[*] Enter to the listen port: ")) break except ValueError: print("[x] Error, please enter a valid port number.") while True: addr = input("[*] Enter the address to connect to(127.0.0.1:8424): ") # 检查输入是否包含冒号 if ':' in addr: try: # 分割地址和端口 client_host, client_port = addr.rsplit(':', 1) # 验证端口是否为数字 if client_port.isdigit(): client_port = int(client_port) # 检查端口范围 if 0 <= client_port <= 65535: # 尝试解析IP地址 try: # 使用ipaddress模块来检查地址的有效性 ipaddress.ip_address(client_host) break # 输入有效,跳出循环 except ValueError: print("Invalid IP address format.") else: print("Port must be between 0 and 65535.") else: print("Port number is not a valid integer.") except ValueError: print("Invalid address format. Please enter in the format 'host:port'.") else: print("Invalid address format. Please enter in the format 'host:port'.") return port, client_host, client_port # test if __name__ == '__main__': port, client_host, client_port = input_verify() a = sender_net(port, client_host, client_port) a.run()