1 ,文件上傳 : 思路
- 服務端開啓,準備接收文件
- 文件內容分三部分
1 ,報文長度
2 ,報文
3 ,文件內容
- 解析 :
1 ,先讀取 4 個字節,得到長度 n ( 固定用 4 字節來存儲長度這個數字 )
2 ,再讀取 n 個字節,得到報文
3 ,解析報文,得到文件長度 m
4 ,寫一個 while 循環,讀取長度爲 m 的文件
2 ,文件上傳 : 服務端
import socket
import struct
import json
sk = socket.socket()
sk.bind(('127.0.0.1', 8888))
sk.listen()
buffer = 1024
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)
file_size = head['filesize']
with open("2.jpg", 'ab') as f:
while file_size:
if file_size >= buffer:
content = conn.recv(buffer)
f.write(content)
file_size -= buffer
else:
content = conn.recv(file_size)
f.write(content)
file_size = 0
break
conn.close()
sk.close()
3 ,文件上傳 : 客戶端
import socket
import os
import json
import struct
sk = socket.socket()
sk.connect(('127.0.0.1', 8888))
buffer = 1024
head = {'filesize': None}
file_name = "1.jpg"
filesize = os.path.getsize(file_name)
head['filesize'] = filesize
json_head = json.dumps(head)
bytes_head = json_head.encode('utf-8')
head_len = len(bytes_head)
pack_len = struct.pack('i', head_len)
sk.send(pack_len)
sk.send(bytes_head)
with open(file_name, 'rb') as f:
while filesize:
if filesize >= buffer:
content = f.read(buffer)
filesize -= buffer
sk.send(content)
else:
content = f.read(filesize)
sk.send(content)
filesize = 0
break
sk.close()
4 ,使用 :
- 先開服務端
- 再開客戶端