本示例在对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
运行输出结果展示:



来源:https://www.cnblogs.com/sun-10387834/p/12316429.html
