4.socket实现文件传输


目的:

通过服务端和客户端的连接,用户向客户端发出命令post 文件名
然后客户端系统根据os.path找到该文件的目录,将文件传输到服务端固定的文件中

即用户端将文件上传到服务端的文件夹中

客户端代码:
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
BASE_DIR=os.path.dirname(os.path.abspath(__file__))  #当前文件夹的绝对路径
print(BASE_DIR)
while 1:
    data=input('想要进行什么操作:(命令和文件之间用空格分开)').strip()
    cmd,path=data.split(' ')    #获取命令和文件名
    path=os.path.join(BASE_DIR,path)  #拼接文件的完整路径
    filename=os.path.basename(path)  #获取文件名
    size=os.stat(path).st_size  #获取文件大小
    file_info='post|%s|%s'%(filename,size)  #将文件的所有信息发送给服务端,以便服务端处理数据
    sk.sendall(file_info.encode('utf-8'))
    f=open(path,'rb')
    has_set=0
    while has_set!= size:    #如果已经发送的数据的大小小于文件大小,继续发送
        data=f.read(1024)
        sk.sendall(data)
        has_set += len(data)
    f.close()
    print('结束')
服务端代码:
import os
sk=socket.socket()
address=('127.0.0.1',8000)
sk.bind(address)
sk.listen(3)
print('waiting...')
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
while 1:
    con,add=sk.accept()
    while 1:
        data=con.recv(1024)
        cmd,filename,filesize=data.decode('utf-8').split('|')
        path=os.path.join(BASE_DIR,'yuan',filename)  #拼接出接收文件的存储路径,即程序目录下的yuan文件夹里的filename文件
        filesize=int(filesize)  #需要接收的数据的大小
        f=open(path,'wb')
        has_get=0
        while has_get!=filesize: #如果已经接收的数据的大小不等于传输过来的文件大小,继续接收数据
            data=con.recv(1024)
            f.write(data)
            has_get +=len(data)
        f.close()

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM