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实现的各种排序算法代码
Mar 04 Python
python实现apahce网站日志分析示例
Apr 02 Python
python使用tkinter实现简单计算器
Jan 30 Python
python如何去除字符串中不想要的字符
Jul 05 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
django-csrf使用和禁用方式
Mar 13 Python
python语言是免费还是收费的?
Jun 15 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 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操作xml代码
2010/06/17 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
php简单压缩css样式示例
2016/09/22 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
react 生命周期实例分析
2020/05/18 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
使用Python在Windows下获取USB PID&VID的方法
2019/07/02 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
房地产管理毕业生自荐信
2013/11/04 职场文书
公关活动策划方案
2014/05/25 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang