客户端:
import socket
import json
import os
import struct
#实例化
sk = socket.socket()
#定义连接的ip和port
ip_port = ('127.0.0.1',8888)
#服务器连接
sk.connect(ip_port)
filePath = 'D:/360极速浏览器下载/A11_0.wav'
fileSize = os.path.getsize(filePath)
# 按照规则进行打包
sk.send('{}|{}'.format( 'A11_0.wav',fileSize).encode())
while True:
res01 = sk.recv(1024)
if res01.decode() == 'ok':
sendSize = 0
# #打开文件
with open(filePath,'rb') as f:
#按每一段分割文件上传
for i in f:
sk.send(i)
sendSize += len(i)
#等待接收完成标志
data=sk.recv(1024)
res = json.dumps(data.decode())
print(res)
print(fileSize)
print(sendSize == fileSize )
if sendSize == fileSize:
break
服务端:
import socket
import threading
import sys
import json
import struct
ip_port=('127.0.0.1',8888)
msg = '链接服务端成功'
def server_start():
sk = socket.socket()
try:
#绑定监听
sk.bind(ip_port)
#最大连接数
sk.listen(5)
except Exception as e:
print(e)
sys.exit(1)
print('启动成功,等待链接',ip_port)
while True:
conn,addr = sk.accept()
conn.send(msg.encode())
t = threading.Thread(target=dispose_data,args=(conn,addr))
t.start()
def dispose_data(conn,addr):
while True:
try:
data = conn.recv(1024)
filename, filesize = data.decode().split('|')
# filename = filename.decode().strip(b"\x00".decode())
print(filename,filesize)
file_size_total = int(filesize)
received_size = 0
conn.send('ok'.encode())
while True:
with open('./'+filename,'ab') as f:
filedata = conn.recv(1024)
f.write(filedata)
received_size += len(filedata) # 计算剩余数据包大小
print(file_size_total,received_size)
if received_size < file_size_total:
conn.send(json.dumps({'status':100,'message':'upload ing'}).encode())
else:
print('接收完毕')
break
except ConnectionResetError as e:
print('客户端{0}断开'.format(addr),e)
conn.close()
sys.exit(1)
if data == exit:
print('{0} client connect close'.format(addr))
break
conn.close()
# 文件操作
def file_operator(data,conn):
file_size_total = 1024
received_size = 0
print(len(data))
with open('./'+'aaa.wav','ab') as f:
f.write(data)
received_size += len(data)
if received_size >= file_size_total:
conn.send(json.dumps({'status':200,'message':'upload success'}).encode())
else:
conn.send(json.dumps({'status':100,'message':'uploading...'}).encode())
if __name__ == "__main__":
server_start()
评论区