ength)) print("接收成功....")
客户端:
import socket
import os
import json
import time
import struct
sock = socket.socket()
sock.connect(('127.0.0.1', 9000))
while 1:
cmd = input("请输入命令>>>") # put 1.jpg
action, filename = cmd.strip().split(" ") # action 命令 filename 文件名
filesize = os.path.getsize(filename)
fileinfo = {
"action": action,
"filename": filename,
"filesize": filesize,
}
fileinfo_json=json.dumps(fileinfo).encode("utf8")
#
ret=struct.pack("i",len(fileinfo_json))
#发送fileinfo_json的打包长度
sock.send(ret)
#发送的是json的数据字节串
sock.send(fileinfo_json)
#发送文件
#发送文件信息的时候字节过小可能与下面的内容一起发送过去导致粘包
with open(filename,"rb") as f: #这边的数据
for line in f:
sock.send(line)
#好处先发送打包好的fileinfo_json打包长度,服务器接收的时候先接收其打包的长度
#再根据打包的长度得到文件信息的json的长度
#再利用json得到文件信息的字典形式,得到第三步发送的文件的总大小,服务器在循环的接收
#把信息打包(pack)成一个数字4为字节串 ,代表文件信息的长度
# res=struct.pack("i",len({"action": action,"filename": filename,"filesize": filesize,}))
#先接收一个4为的字节串,得到文件信息
ret=sock.recv(4) #ret表示的是接收的是pack后的文件信息
#再利用unpack解开打包了的信息的长度,先把文件的信息接收过来,用json把其变成字典
file_info=json.loads(sock.recv(ret).decode())#变成字典可以字节根据字典来的来文件的总大小