1.先将一张图片拖入‘文件上传’的目录下,利用socket把这张图片写到叫‘yuan’的文件中
2.代码:
1 #模拟服务端 2 import subprocess 3 import os 4 import socket 5 sk=socket.socket() 6 print(sk) 7 address=('127.0.0.1',8080) 8 sk.bind(address) 9 BASE_DIR=os.path.dirname(os.path.abspath(__file__))#获取绝对路径 10 11 sk.listen(3) 12 print('waiting......') 13 # conn=sk.accept() 14 # print(conn) 15 16 while 1: 17 conn,addr=sk.accept() 18 while True: 19 data=conn.recv(1024) 20 cmd,filename,filesize=str(data,'utf8').split('|') 21 path=os.path.join(BASE_DIR,'yuan',filename)#拼接出要写入的文件地址 22 print(path) 23 filesize=int(filesize) 24 25 f=open(path,'ab') 26 has_receiv=0 27 while has_receiv!=filesize: 28 data=conn.recv(1024) 29 f.write(data) 30 f.close() 31 sk.close()
模拟客户端 import socket import os sk=socket.socket() #print(sk) address=('127.0.0.1',8080) sk.connect(address) BASE_DIR=os.path.dirname(os.path.abspath(__file__))#获取相对路径 print(BASE_DIR) while 1: inp =input('>>>>>').strip()#post|图片.jpg cmd,path=inp.split('|')#字符分割放入两变量中 path=os.path.join(BASE_DIR,path)#join在文件最末尾处拼接字符上去 #print('path',path) filename=os.path.basename(path)#获取文件名,返回path最后的文件名。如何path以/或结尾,那么就会返回空值 file_size=os.stat(path).st_size#获取文件大小(os.stat() 方法用于在给定的路径上执行一个系统 stat 的调用,st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。) file_info='post|%s|%s'%(filename,file_size)#将文件的所有数据(文件名,文件大小)做成一个字符 sk.sendall(bytes(file_info,'utf8 ')) has_sent = 0 # with open(path,'rb') as f: # data=f.read(1024) # sk.sendall(data) # has_sent+=len(data) # f.close() # print('上传成功') #第二种读取图片文件的信息 fa=open(path,'rb') while has_sent!=file_size: data=fa.read(1024) sk.send(data) has_sent+=len(data) fa.close() print('上传成功') sk.close()
3效果: