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 相关文章推荐
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
用Python计算三角函数之atan()方法的使用
May 15 Python
简单讲解Python中的数字类型及基本的数学计算
Mar 11 Python
Python实现单词翻译功能
Jun 06 Python
Python中extend和append的区别讲解
Jan 24 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python读取并写入mat文件的方法
Jul 12 Python
Python中类似于jquery的pyquery库用法分析
Dec 02 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
python日期与时间戳的各种转换示例
Feb 12 Python
python基础之类方法和静态方法
Oct 24 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
JSON在PHP中的应用介绍
2012/09/08 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
jQuery滚动加载图片实现原理
2015/12/14 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
python getopt详解及简单实例
2016/12/30 Python
python3.5 email实现发送邮件功能
2018/05/22 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
如何在python中实现线性回归
2020/08/10 Python
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
最新创业融资计划书
2014/01/19 职场文书
党建示范点实施方案
2014/03/12 职场文书
写景作文评语集锦
2014/12/25 职场文书
MySQL锁机制
2021/04/05 MySQL
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
Python几种酷炫的进度条的方式
2022/04/11 Python