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 set集合类型操作总结
Nov 07 Python
python套接字流重定向实例汇总
Mar 03 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
详谈python read readline readlines的区别
Sep 22 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
python多线程并发实例及其优化
Jun 27 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
Python xlwt模块使用代码实例
Jun 10 Python
 Python 中 logging 模块使用详情
Mar 03 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实现学生管理系统
2020/03/21 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
简介Python中用于处理字符串的center()方法
2015/05/18 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
python返回数组的索引实例
2019/11/28 Python
python利用platform模块获取系统信息
2020/10/09 Python
法人授权委托书
2014/04/03 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
婚纱店策划方案
2014/05/22 职场文书
活动新闻稿范文
2015/07/17 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL