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 14 Python
详解Python中用于计算指数的exp()方法
May 14 Python
Python 多核并行计算的示例代码
Nov 07 Python
django ajax json的实例代码
May 29 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 Python
对python中if语句的真假判断实例详解
Feb 18 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
Jun 17 Python
python字典与json转换的方法总结
Dec 28 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 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输出时间差函数代码
2013/01/28 PHP
PHP实现合并discuz用户
2015/08/05 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
Python 功能和特点(新手必学)
2015/12/30 Python
Python优先队列实现方法示例
2017/09/21 Python
python实现图片处理和特征提取详解
2017/11/13 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
python多线程分块读取文件
2019/08/29 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
标准导师推荐信(医学类)
2013/10/28 职场文书
超市端午节活动方案
2014/01/23 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
2014年党课学习材料
2014/05/11 职场文书
软环境建设心得体会
2014/09/09 职场文书
市场营销工作计划书
2014/09/15 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL