recyvan_2 v1.0
recyvan 3 months ago
parent 2a470a47cf
commit 10ad84e676

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