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