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中pygame安装方法图文详解
Nov 11 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
Scrapy框架使用的基本知识
Oct 21 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
Python实战之制作天气查询软件
May 14 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
python写程序统计词频的方法
Jul 29 Python
Python定时器线程池原理详解
Feb 26 Python
Python的in,is和id函数代码实例
Apr 18 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 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基础陷阱题(变量赋值)
2012/09/12 PHP
php实现微信发红包功能
2018/07/13 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
javascript事件模型介绍
2016/05/31 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
大课间活动制度
2014/01/18 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
护理工作个人总结
2015/03/03 职场文书
2016年教师节慰问信
2015/12/01 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书