实现文件传输

import socket
import json
import struct
import os
server=socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(10)

while True:
try:
sock, addr = server.accept()
data=sock.recv(10)
data=data.decode('utf8')
if data=='q':
# 获取文件名称
file_name=input('请输入文件名称>>>:').strip()
# 获取需要传输的文件路径
file_path=input('请输入你需要传输的文件路径>>>:').strip()
if os.path.exists(file_path):
# 定义一个字典
data_dict={
'file_name':file_name,
'file_size':os.path.getsize(file_path)
}
# 将子弹转为json格式
dict_json=json.dumps(data_dict)
# 转成bytes类型
dict_bytes=dict_json.encode('utf8')
# 打包
dict_data=struct.pack('i',len(dict_bytes))
# 发送报头
sock.send(dict_data)
# 发送字典
sock.send(dict_bytes)
with open(file_path,'rb') as f:
for line in f:
sock.send(line)
else:
print('文件路径不存在!')
else:
break
except Exception as e:
break

客户端:
import socket
import struct
import json
client=socket.socket()
client.connect(('127.0.0.1',8080))
while True:
# 询问是否接受文件
choice = input('是否接受文件(q)>>>:').strip()
choice1 = choice.encode('utf8')
client.send(choice1)
if choice=='q':
# 接受报头
dict_data=client.recv(4)
if dict_data:
# 解析
dict_len=struct.unpack('i',dict_data)[0]
print(dict_len)
# 接受字典
dict_data1=client.recv(dict_len)
dict_data1=json.loads(dict_data1)
recv_size=0
with open(r'%s'%dict_data1.get('file_name'),'wb') as f:
while recv_size<dict_data1.get('file_size'):
data=client.recv(1024)
recv_size+=len(data)
f.write(data)
else:
continue
else:
break

posted on 2022-04-18 20:39  淦白嫖怪  阅读(63)  评论(0)    收藏  举报

导航