socket實現文件上傳(客戶端向服務器端上傳照片示例)

本示例在對socket有了基本瞭解以後,能夠實現基本的文件上傳。首先先介紹一下目錄結構,server_data文件夾是用來存放客戶端上傳的文件,client_data是模擬客戶端文件夾(目的是爲了測試文件夾下的文件可否上傳) ,還有兩個主要的py文件,onload_server.py  onload_client.py 。服務器

目錄結構如圖:socket

 

 

下面直接上兩段主要py文件代碼:

客戶端(上傳端)代碼:

 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
服務器端

運行輸出結果展現:

 

 

 

 

相關文章
相關標籤/搜索