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使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python标准库之循环器(itertools)介绍
Nov 25 Python
python生成随机mac地址的方法
Mar 16 Python
python算法与数据结构之冒泡排序实例详解
Jun 22 Python
解决python tkinter界面卡死的问题
Jul 17 Python
Django 拆分model和view的实现方法
Aug 16 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
python使用协程实现并发操作的方法详解
Dec 27 Python
利用python绘制数据曲线图的实现
Apr 09 Python
django rest framework serializers序列化实例
May 13 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
Python读取Excel数据并生成图表过程解析
Jun 18 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抽象工厂模式(Elgg)
2010/03/21 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
简介Python中用于处理字符串的center()方法
2015/05/18 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
python实现共轭梯度法
2019/07/03 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
预防艾滋病宣传标语
2014/06/25 职场文书
个人委托书
2014/07/31 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
车间质检员岗位职责
2015/04/08 职场文书
毕业酒会致辞
2015/07/29 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书