parent
d0473821b0
commit
f157855670
@ -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']
|
||||
|
Loading…
Reference in new issue