网络上传输的数据都叫数据包,包里的数据都叫报文
报文里不只有数据,还有ip地址mac地址端口号等,存在报头里
自己定制报文:比如文件名字、大小、类型、路径等
head = {'filename':'test','filesize':409600}
# 报头的长度 #先接收4个字节
#send(head) #根据4个字节获取报头
#send(file) #从报头获取filesize,然后根据filesize接收文件
#DDF协议
网络传输过程中处处有协议,协议就是一堆报头和报文,协议的解析过程不需要关心
协议本质上就是一种约定
SEVER:
import socket
import struct
import json
sk = socket.socket()
sk.bind(('127.0.0.1',8090))
sk.listen()
buffer = 1024
conn, addr = sk.accept()
pack_len = conn.recv(4)
head_len = struct.unpack('i',pack_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:
cont = conn.recv(buffer)
f.write(cont)
filesize -= buffer
else:
cont = conn.recv(filesize)
f.write(cont)
break
conn.close()
sk.close()
CLIENT:
import socket
import os
import struct
import json
buffer = 1024
sk = socket.socket()
sk.connect(('127.0.0.1',8090))
filepath = input('请输入文件路径:')
filename = input('请输入文件名')
head = {'filename':filename,'filepath':filepath,'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_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:
cont = f.read(buffer)
sk.send(cont)
filesize -= buffer
else:
cont = f.read(filesize)
sk.send(cont)
break
sk.close()