Python Socket传输文件示例


Posted in Python onJanuary 16, 2017

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

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

接收端:

方法一:

#-*- coding: UTF-8 -*-
import socket,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)

 
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,os
host='192.168.50.74'
port=12307
ADDR=(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,struct
s = 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 相关文章推荐
python 装饰器功能以及函数参数使用介绍
Jan 27 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
Python切片操作实例分析
Mar 16 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
python实现简单日期工具类
Apr 24 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
Django celery异步任务实现代码示例
Nov 26 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
python FTP编程基础入门
Feb 27 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 #Python
python一键升级所有pip package的方法
Jan 16 #Python
centos6.7安装python2.7.11的具体方法
Jan 16 #Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 #Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 #Python
python 根据pid杀死相应进程的方法
Jan 16 #Python
总结python实现父类调用两种方法的不同
Jan 15 #Python
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
Jquery 插件开发笔记整理
2011/01/17 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
全面解析Python的While循环语句的使用方法
2015/10/13 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
python实现猜数字小游戏
2020/03/24 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
keras K.function获取某层的输出操作
2020/06/29 Python
python实现邮件循环自动发件功能
2020/09/11 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
社会实践评语
2014/04/28 职场文书
事业单位鉴定材料
2014/05/25 职场文书
音乐幼师求职信
2014/07/09 职场文书
综合测评自我评价
2015/03/06 职场文书
庆元旦主持词
2015/07/06 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书