服务端
import struct, json, socket IP = '127.0.0.1' PORT = 8080 ADD = (IP, PORT) sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sever.bind(ADD) sever.listen(5) conn, addr = sever.accept() '''获取报头长度bytes''' s_hander = conn.recv(4) '''解包bytes-》tuple-》int,获得报头长度''' s_hander = struct.unpack('i', s_hander)[0] print(s_hander) '''获取报头数据,bytes''' b_hander = conn.recv(s_hander) print(b_hander) '''报头数据解码 bytes-》str''' json_hander = b_hander.decode('utf-8') print(json_hander) '''报头数据反序列化 str-》dict''' hander = json.loads(json_hander) print(hander) '''获取报头字典,取的文件长度,取出文件内容''' file_size = hander['length'] res = b'' size = 0 while size < file_size: date = conn.recv(1024) size += len(date) res += date print(res.decode('utf-8')) # date = (conn.recv(file_size)).decode('utf-8') # print(date)
客户端
import socket, os, json, struct IP = '127.0.0.1' PORT = 8080 ADD = (IP, PORT) client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(ADD) # 上传文件 while True: file_path = input('请输入文件路径>>').strip() if not os.path.exists(file_path): print('文件不存在') continue file_name = (os.path.split(file_path))[1] with open(file_path, 'r', encoding='utf-8')as f: date = f.read() size = len(date) hander = { 'file_name': file_name, 'length': size } # 报头序列化 hander_json = json.dumps(hander) # 报头bytes转换 hander_bytes = hander_json.encode('utf-8') # 报头长度固定 s_hander = struct.pack('i', len(hander_bytes)) # 传输报头长度 client.send(s_hander) # 传输报头数据 client.send(hander_bytes) # 传输文件数据 client.send(date.encode('utf-8'))
总结:
-报头设置(传输方 )
1)报头字典编写(dict)
2)报头序列化(dict->str)
3)报头长度固定数据转换(int->bytes)
4)传输报头长度(bytes)
5)传输报头(bytes)
6)传输文件(bytes)
-报头解包(接收方)
1)以固定长度,接收报头长度(bytes)并解码(bytes->int)
2)以报头长度获取报头内容,并解码(bytes->str)
3)报头数据反序列化(str->dict)
4)获取数据长度(bytes)
5)根据数据长度获取数据,并解码(bytes->str)