socket实现文件上传(客户端向服务器端上传照片示例)

时间:2024-02-01 19:22:00

本示例在对socket有了基本了解之后,可以实现基本的文件上传。首先先介绍一下目录结构,server_data文件夹是用来存放客户端上传的文件,client_data是模拟客户端文件夹(目的是为了测试文件夹下的文件能否上传) ,还有两个主要的py文件,onload_server.py  onload_client.py 。

目录结构如图:

 

 

下面直接上两段主要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
服务器端

运行输出结果展示: