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中itertools模块用法详解
Sep 25 Python
Python urllib、urllib2、httplib抓取网页代码实例
May 09 Python
Python中的集合类型知识讲解
Aug 19 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
详解python 拆包可迭代数据如tuple, list
Dec 29 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
python实现电子词典
Mar 03 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
python openssl模块安装及用法
Dec 06 Python
Pytorch 实现变量类型转换
May 17 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.ini中文版(1)
2006/10/09 PHP
php产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
PHP Reflection API详解
2015/05/12 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
php获取微信openid方法总结
2019/10/10 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
js实现蒙版效果
2020/01/11 Javascript
原生js实现日历效果
2020/03/02 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
python下如何让web元素的生成更简单的分析
2008/07/17 Python
Python检测QQ在线状态的方法
2015/05/09 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
公积金贷款承诺书
2015/04/30 职场文书
七一慰问简报
2015/07/20 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫