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实现在每个独立进程中运行一个函数的方法
Apr 23 Python
详解python中的线程
Feb 10 Python
python进行两个表格对比的方法
Jun 27 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
python实现银行账户系统
Feb 22 Python
深度学习详解之初试机器学习
Apr 14 Python
关于Python中进度条的六个实用技巧分享
Apr 05 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
各种战术和打法的原创者
2020/03/04 星际争霸
Protoss建筑一览
2020/03/14 星际争霸
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
JavaScript DOM基础
2015/04/13 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
Python制作CSDN免积分下载器
2015/03/10 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
python redis 删除key脚本的实例
2019/02/19 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
Python流程控制常用工具详解
2020/02/24 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
冰淇淋店的创业计划书
2014/02/07 职场文书
小小的船教学反思
2014/02/21 职场文书
岗位职责风险点
2014/03/12 职场文书
新年晚会主持词
2014/03/24 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书