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抓取网页中的图片示例
Feb 28 Python
python使用urllib2实现发送带cookie的请求
Apr 28 Python
python从sqlite读取并显示数据的方法
May 08 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
Jun 15 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
Python3 无重复字符的最长子串的实现
Oct 08 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
Python partial函数原理及用法解析
Dec 11 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 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
利用 window_onload 实现select默认选择
2006/10/09 PHP
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
python出现"IndentationError: unexpected indent"错误解决办法
2017/10/15 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
临床医学专业学生的自我评价分享
2013/11/21 职场文书
会议接待欢迎标语
2014/10/08 职场文书
2014会计年终工作总结
2014/12/20 职场文书
前台文员岗位职责
2015/02/04 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
Python 内置函数速查表一览
2021/06/02 Python