25 struct定制报头以及ftp实践

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()

猜你喜欢

转载自blog.csdn.net/weixin_43265998/article/details/89761162
25