本示例在對socket有了基本瞭解以後,能夠實現基本的文件上傳。首先先介紹一下目錄結構,server_data文件夾是用來存放客戶端上傳的文件,client_data是模擬客戶端文件夾(目的是爲了測試文件夾下的文件可否上傳) ,還有兩個主要的py文件,onload_server.py onload_client.py 。服務器
目錄結構如圖:socket
1 #__author__:Kelvin 2 #date:2020/2/16 11:09 3 4 import socket,os 5 6 sk=socket.socket() 7 address=("127.0.0.1",8000) 8 sk.connect(address) 9 10 while True: 11 inp=input("請輸入 命令|文件名:") # post|a.jpg 12 size=os.path.getsize(inp.split("|")[1]) 13 # print(size) 14 inp=inp+"|%s"%size 15 sk.send(inp.encode("utf8")) 16 sk.recv(1024) # 接收 避免粘包發送的無效數據 17 f=open(inp.split("|")[1],"rb") 18 sent_size=0 19 while sent_size!=size: 20 sent_data=f.read(1024) 21 sk.send(sent_data) 22 sent_size+=len(sent_data) 23 # print(sent_size) 24 f.close() 25 print("%s 文件上傳成功..."%inp.split("|")[1].split("|")[-1]) 26 break 27 sk.close()
1 #__author__:Kelvin 2 #date:2020/2/16 11:09 3 4 import socket 5 6 sk=socket.socket() 7 address=("127.0.0.1",8000) 8 sk.bind(address) 9 sk.listen(5) 10 while True: 11 conn,addr=sk.accept() 12 print(addr,"已鏈接...") 13 while True: 14 data=conn.recv(1024).decode("utf8") 15 size=int(data.split("|")[2]) 16 file_name=data.split("|")[1].split("/")[-1] 17 conn.send("1".encode("utf8")) # 避免粘包,無實際做用 18 # print(size,file_name) 19 f=open("server_data/%s"%file_name,"wb") 20 saved_size=0 21 while saved_size!=size: 22 rev_data=conn.recv(1024) 23 f.write(rev_data) 24 saved_size+=len(rev_data) 25 # print(saved_size) 26 f.close() 27 print("%s 文件接收成功..."%file_name) 28 conn.close() 29 break