服務器端
import socket
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 獲取絕對路徑
sk = socket.socket()
address = ('127.0.0.1', 8000) # 地址
sk.bind(address) # 綁定
sk.listen(4) # 監聽
while 1:
conn, addr = sk.accept() # 阻塞
while 1:
# 接收文件信息 並解析
data = conn.recv(1024)
cmd, filename, filesize = str(data, 'utf8').split('|')
path = os.path.join(BASE_DIR, 'pic', filename)
filesize = int(filesize)
# 接收文件
f = open(path, 'ab')
has_receive = 0
while has_receive != filesize:
data = conn.recv(1024)
f.write(data)
has_receive += len(data)
f.close()
sk.close()
客戶端
import socket
import os
sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
while 1:
# 發送文件信息
inp = input('>>>').strip()
cmd, path = inp.split('|') # post socket.png
path = os.path.join(BASE_DIR, path) # 獲取絕對路徑 路徑與文件名拼接
filename = os.path.basename(path) # 獲取文件名
file_size = os.stat(path).st_size # 獲取文件大小
file_info = 'post|%s|%s' % (filename, file_size) # 字符串拼接 打包
sk.sendall(bytes(file_info, 'utf8'))
# 發送數據
f = open(path, 'rb') # 二進制格式讀取
has_sent = 0 # 記錄已發送數據大小
while has_sent != file_size:
data = f.read(1024) # 一段一段發
sk.sendall(data)
has_sent += len(data) # 已發送數據大小累加
f.close()
print('post successful')
記得在上述文件同級目錄下新建一個文件夾pic用於接收文件
在客戶端運行端口輸入 'cmd|img.png' 其中cmd 爲post img.png爲上傳目標圖片,事前放進同級目錄下。也可以自己填文件路徑
例如:我的文件爲:socket.png
你也可以右鍵上圖另存爲socket.png 然後放進上面同級目錄下
然後運行服務器端和客戶端,在客戶端終端輸入 post|socket.png
如果提示post successful就完成文件上傳操作了。