struct定制报头以及ftp传输文件
我们自网络上传输的所有数据,都叫数据包,数据包里的所有数据,都叫报文。报文里不止包含要发送的消息信息,还包括了ip地址,mac地址,端口号等。。。
所有的报文都有报头,这是协议决定的。报文中包含里要接受多少个字节的信息等。我们可以自己定义报文,在网络传输过程中,处处有协议,协议就是一堆报文和报头。
实现一个大文件的上传或者下载
#server端
import socket,json
import struct
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
buffer = 4096
sk.listen()
conn,addr = sk.accept()
#接收
head_len = conn.recv(4)
head_len = struct.unpack('i',head_len)[0]
json_head = conn.recv(head_len).decode('utf-8')
head = json.loads(json_head)
filesize = head['filesize']
with open(head['filename'],'wb')as f:
while filesize:
if filesize >= buffer:
content = conn.recv(buffer)
f.write(content)
filesize-=buffer
else:
content = conn.recv(filesize)
f.write(content)
break
conn.close()
sk.close()
#client端
import struct
import socket,os,json
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
buffer = 4096
#发送文件
head = {'filepath':r'地址',
'filename':'名字',
'filesize':None
}
file_path = os.path.join(head['filepath'],head['filename'])
filesize = os.path.getsize(file_path)
head['filesize'] = filesize
json_head = json.dumps(head) #字典转成字符串
bytes_head = json_head.encode('utf-8') #字符串转为bytes
#计算head长度
head_len = len(bytes_head) #报头长度
pack_len = struct.pack('i',head_len)
sk.send(pack_len) #先发送报头的长度
sk.send(bytes_head) #发送报头
with open(file_path,'rb') as f:
while filesize:
if filesize > buffer:
content = f.read(buffer)
sk.send(content)
filesize -= buffer
else:
content = f.read(filesize)
sk.send(content)
break
sk.close()