<>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()
热门工具 换一换