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

@ -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()
Loading…
Cancel
Save