python使用tcp socket 传输文件-服务端,客户端

来源:互联网 发布:查看linux防火墙状态 编辑:程序博客网 时间:2024/05/19 22:57

1.文件接收-服务端

#_*_coding:utf-8_*_# !/etc/bin/env python2.7#coded by wangjd@2017#socket file serverimport socketimport SocketServerimport structimport os#导入外部插件#定义服务器,地址,端口address=("",9999)#(ip,port)class MyRequestHandler(SocketServer.BaseRequestHandler):    #继承SocketServer请求处理的类    def handle(self):        #重写handle方法        print("connect from :",self.client_address)        # 打印客户端连接的IP        while True:            #没有报错执行            fileinfo_size=struct.calcsize('128sl')            #定义文件信息,文件名为128bytes长度            self.buf=self.request.recv(fileinfo_size)            #接受的是客户端发送过来的头部信息            if self.buf:                self.filename,self.filesize=struct.unpack('128sl',self.buf)                #解包得到文件名和文件大小                print("filename and size:",self.filename,self.filesize)                self.filename=os.path.join('/home/wangjd/Desktop/','new'+self.filename.strip('\00'))                #重新处理文件名,使用trip删除打包时候的多余空字符                recvd_size=0                #初始化接受了的文件大小                file=open(self.filename,'wb')                #打开文件                print("start recv data..")                while not recvd_size==self.filesize:                    #当没接收完时候执行                    if self.filesize -recvd_size > 1024:                        rdata=self.request.recv(1024)                        recvd_size+=len(rdata)                        #叠加大小                    else:                        rdata=self.request.recv(self.filesize-recvd_size)                        recvd_size=self.filesize                    file.write(rdata)                    #写入                file.close()                #关闭文件                SocketServer                print('data.....finish')if __name__ == '__main__':        tcpSever=SocketServer.ThreadingTCPServer(address,MyRequestHandler)        print('waiting...')        tcpSever.serve_forever()        #保持

2.文件发送-客户端

#_*_coding:utf-8_*_# !/etc/bin/env python2.7#coded by wangjd@2017#file clientsimport socketimport timeimport structimport os#导入外部插件#定义客户端,地址sc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#实例化socketaddress=('127.0.0.1',9999)#定义addresssc.connect(address)#发起连接while True:    file_path="/home/wangjd/Desktop/test.txt"    #定义要传输的文件地址    file_info_size=struct.calcsize('128sl')    #定义打包规则    fhead=struct.pack('128sl',os.path.basename(file_path),os.stat(file_path).st_size)    #定义头信息    sc.send(fhead)    #首先发送头部信息    print("send file:",file_path)    #打印文件信息    if True:        #一切正常,开始处理文件        fo=open(file_path, 'rb')        fileData=fo.read(1024)        #读取文件数据,1024切分        if not fileData:            break            #文件为空break        else:             sc.send(fileData)            #发送数据,1024切分的数据        fo.close()        #发送结束,关闭文件。        print("finish send..")    sc.close()    exit()
原创粉丝点击