Python Socket传输文件,,发送端可以不停的发送


发送端可以不停的发送新文件,接收端可以不停的接收新文件。

例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下;

接收端:

方法一:

#-*- coding: UTF-8 -*-import socket,time,SocketServer,struct,os,threadhost=‘192.168.50.74‘port=12307s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定义socket类型s.bind((host,port)) #绑定需要监听的Ip和端口号,tuple格式s.listen(1) def conn_thread(connection,address):      while True:        try:            connection.settimeout(600)            fileinfo_size=struct.calcsize(‘128sl‘)             buf = connection.recv(fileinfo_size)            if buf: #如果不加这个if,第一个文件传输完成后会自动走到下一句                filename,filesize =struct.unpack(‘128sl‘,buf)                 filename_f = filename.strip(‘\00‘)                filenewname = os.path.join(‘e:\\‘,(‘new_‘+ filename_f))                print ‘file new name is %s, filesize is %s‘ %(filenewname,filesize)                recvd_size = 0 #定义接收了的文件大小                file = open(filenewname,‘wb‘)                print ‘stat receiving...‘                while not recvd_size == filesize:                    if filesize - recvd_size > 1024:                        rdata = connection.recv(1024)                        recvd_size += len(rdata)                    else:                        rdata = connection.recv(filesize - recvd_size)                         recvd_size = filesize                    file.write(rdata)                file.close()                print ‘receive done‘                #connection.close()        except socket.timeout:            connection.close()while True:    connection,address=s.accept()    print(‘Connected by ‘,address)    #thread = threading.Thread(target=conn_thread,args=(connection,address)) #使用threading也可以    #thread.start()    thread.start_new_thread(conn_thread,(connection,address)) s.close()

方法二:

#-*- coding: UTF-8 -*-import socket,time,SocketServer,struct,oshost=‘192.168.50.74‘port=12307ADDR=(host,port)class MyRequestHandler(SocketServer.BaseRequestHandler):        def handle(self):              print(‘connected from:‘, self.client_address)        while True:            fileinfo_size=struct.calcsize(‘128sl‘) #定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小            self.buf = self.request.recv(fileinfo_size)            if self.buf: #如果不加这个if,第一个文件传输完成后会自动走到下一句                self.filename,self.filesize =struct.unpack(‘128sl‘,self.buf) #根据128sl解包文件信息,与client端的打包规则相同                print ‘filesize is: ‘,self.filesize,‘filename size is: ‘,len(self.filename) #文件名长度为128,大于文件名实际长度                self.filenewname = os.path.join(‘e:\\‘,(‘new_‘+ self.filename).strip(‘\00‘)) #使用strip()删除打包时附加的多余空字符                print self.filenewname,type(self.filenewname)                recvd_size = 0 #定义接收了的文件大小                file = open(self.filenewname,‘wb‘)                print ‘stat receiving...‘                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()                print ‘receive done‘        #self.request.close()tcpServ = SocketServer.ThreadingTCPServer(ADDR, MyRequestHandler)  print(‘waiting for connection...‘ )tcpServ.serve_forever()

发送端:

#-*- coding: UTF-8 -*-import socket,os,structs = socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect((‘192.168.50.74‘,12307))while True:        filepath = raw_input(‘Please Enter chars:\r\n‘)    if os.path.isfile(filepath):        fileinfo_size=struct.calcsize(‘128sl‘) #定义打包规则        #定义文件头信息,包含文件名和文件大小        fhead = struct.pack(‘128sl‘,os.path.basename(filepath),os.stat(filepath).st_size)        s.send(fhead)         print ‘client filepath: ‘,filepath        # with open(filepath,‘rb‘) as fo: 这样发送文件有问题,发送完成后还会发一些东西过去        fo = open(filepath,‘rb‘)        while True:            filedata = fo.read(1024)            if not filedata:                break            s.send(filedata)        fo.close()        print ‘send over...‘        #s.close()

Python Socket传输文件

相关内容

    暂无相关文章

评论关闭