From f157855670c4829a77a9cd3a37b8c0eaf0531e23 Mon Sep 17 00:00:00 2001 From: pewxvf3lf <431321064@qq.com> Date: Thu, 26 Dec 2024 23:47:11 +0800 Subject: [PATCH] ADD file via upload --- tcp_server.py | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 tcp_server.py diff --git a/tcp_server.py b/tcp_server.py new file mode 100644 index 0000000..1b83f9d --- /dev/null +++ b/tcp_server.py @@ -0,0 +1,106 @@ +from socket import * +import struct +import json +import os +from PyQt5.QtCore import pyqtSignal, QObject +from RSA_Module import * +class TCPServer(QObject): + #定义信号 + progress_updated = pyqtSignal(int) + def __init__(self, ip='127.0.0.1', port=8080, buffsize=1024): + super().__init__() + self.ip = ip + self.port = port + self.buffsize = buffsize + self.tcp_server = None + self.command = None + self.client_conn = False # 保存客户端连接 + + def run_server(self): + """启动服务器""" + self.tcp_server = socket(AF_INET, SOCK_STREAM) + self.tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) + self.tcp_server.bind((self.ip, self.port)) + self.tcp_server.listen(5) + generate_rsakey('serverpub.pem', 'serverpri.pem') + + + def send_file(self, conn, filename, filesize_bytes, fileindex, ext): + """发送文件给客户端""" + newfilename = os.path.basename(filename) + dirc = { + 'filename': newfilename, + 'filesize_bytes': filesize_bytes, + 'fileindex': fileindex, + 'fileext': ext, + } + head_info = json.dumps(dirc) # 将字典转换成JSON格式 + head_info_len = struct.pack('i', len(head_info)) # 将字符串的长度打包 + # 发送文件信息 + conn.send(head_info_len) # 发送head_info的长度 + conn.send(head_info.encode('utf-8')) + + # 发送文件数据 + with open(filename, 'rb') as f: + send_bytes = 0 + while True: + data = f.read(1024) + if not data: + break + conn.sendall(data) + send_bytes += len(data) + progress = int((send_bytes / filesize_bytes) * 100) + self.progress_updated.emit(progress) + self.progress_updated.emit(100) # 确保进度条达到100% + + def send_serverpub(self, server_conn): + filesize = os.path.getsize('./.tempfile/serverpub.pem') + newfilename = 'new_' + os.path.basename('./.tempfile/serverpub.pem') + dirc = { + 'filename': newfilename, + 'filesize': filesize, + } + head_info = json.dumps(dirc) + head_info_len = struct.pack('i', len(head_info)) + server_conn.send(head_info_len) # 发送head_info的长度 + server_conn.send(head_info.encode('utf-8')) + # 发送文件数据 + with open('./.tempfile/serverpub.pem', 'rb') as f: + data = f.read() + server_conn.sendall(data) + + def recv_clientpub(self, server_conn): + head_info_len = server_conn.recv(4) + head_info_len = struct.unpack('i', head_info_len)[0] + + head_info = server_conn.recv(head_info_len) + dirc = json.loads(head_info.decode('utf-8')) + filename = dirc['filename'] + filesize = dirc['filesize'] + received_size = 0 + with open(f'./.tempfile/{filename}', 'wb') as f: + while received_size < filesize: + if filesize - received_size > self.buffsize: + data = server_conn.recv(self.buffsize) + f.write(data) + received_size += len(data) + else: + data = server_conn.recv(filesize - received_size) + f.write(data) + received_size += len(data) + if received_size == filesize: + return True, filename + else: + return False, filename + + def judge_send_status(self, conn): + judge_len = conn.recv(4) + if len(judge_len) == 4: + judge_len = struct.unpack('i', judge_len)[0] + judge = conn.recv(judge_len) + dirc = json.loads(judge.decode('utf-8')) + if not dirc['state']: + return False, dirc['fileindex'] + else: + return True, dirc['fileindex'] +