Python Socket传输文件示例
发送端可以不停的发送新文件,接收端可以不停的接收新文件。
例如:发送端输入:e:\visio.rar,接收端会默认保存为e:\new_visio.rar,支持多并发,具体实现如下;
接收端:
方法一:
#-*-coding:UTF-8-*-
importsocket,time,SocketServer,struct,os,thread
host='192.168.50.74'
port=12307
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#定义socket类型
s.bind((host,port))#绑定需要监听的Ip和端口号,tuple格式
s.listen(1)
defconn_thread(connection,address):
whileTrue:
try:
connection.settimeout(600)
fileinfo_size=struct.calcsize('128sl')
buf=connection.recv(fileinfo_size)
ifbuf:#如果不加这个if,第一个文件传输完成后会自动走到下一句
filename,filesize=struct.unpack('128sl',buf)
filename_f=filename.strip('\00')
filenewname=os.path.join('e:\\',('new_'+filename_f))
print'filenewnameis%s,filesizeis%s'%(filenewname,filesize)
recvd_size=0#定义接收了的文件大小
file=open(filenewname,'wb')
print'statreceiving...'
whilenotrecvd_size==filesize:
iffilesize-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'receivedone'
#connection.close()
exceptsocket.timeout:
connection.close()
whileTrue:
connection,address=s.accept()
print('Connectedby',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-*-
importsocket,time,SocketServer,struct,os
host='192.168.50.74'
port=12307
ADDR=(host,port)
classMyRequestHandler(SocketServer.BaseRequestHandler):
defhandle(self):
print('connectedfrom:',self.client_address)
whileTrue:
fileinfo_size=struct.calcsize('128sl')#定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
self.buf=self.request.recv(fileinfo_size)
ifself.buf:#如果不加这个if,第一个文件传输完成后会自动走到下一句
self.filename,self.filesize=struct.unpack('128sl',self.buf)#根据128sl解包文件信息,与client端的打包规则相同
print'filesizeis:',self.filesize,'filenamesizeis:',len(self.filename)#文件名长度为128,大于文件名实际长度
self.filenewname=os.path.join('e:\\',('new_'+self.filename).strip('\00'))#使用strip()删除打包时附加的多余空字符
printself.filenewname,type(self.filenewname)
recvd_size=0#定义接收了的文件大小
file=open(self.filenewname,'wb')
print'statreceiving...'
whilenotrecvd_size==self.filesize:
ifself.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'receivedone'
#self.request.close()
tcpServ=SocketServer.ThreadingTCPServer(ADDR,MyRequestHandler)
print('waitingforconnection...')
tcpServ.serve_forever()
发送端:
#-*-coding:UTF-8-*-
importsocket,os,struct
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('192.168.50.74',12307))
whileTrue:
filepath=raw_input('PleaseEnterchars:\r\n')
ifos.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'clientfilepath:',filepath
#withopen(filepath,'rb')asfo:这样发送文件有问题,发送完成后还会发一些东西过去
fo=open(filepath,'rb')
whileTrue:
filedata=fo.read(1024)
ifnotfiledata:
break
s.send(filedata)
fo.close()
print'sendover...'
#s.close()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。