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中变量的作用域
Jun 16 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
python中with用法讲解
Feb 07 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
numpy矩阵数值太多不能全部显示的解决
May 14 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
python hmac模块验证客户端的合法性
Nov 07 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 Python
python中mongodb包操作数据库
Apr 19 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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python装饰器语法糖
2019/01/02 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python turtle 绘制太极图的实例
2019/12/18 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
python属于软件吗
2020/06/18 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
一套软件开发工程师笔试题
2015/05/18 面试题
建筑设计学生的自我评价
2014/01/16 职场文书
小学师德师风演讲稿
2014/09/02 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2014年底个人工作总结
2015/03/10 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript