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 相关文章推荐
Python3中的2to3转换工具使用示例
Jun 12 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
总结python实现父类调用两种方法的不同
Jan 15 Python
Python实现在线音乐播放器
Mar 03 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Python之Class&Object用法详解
Dec 25 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
python数据类型强制转换实例详解
Jun 22 Python
Python之qq自动发消息的示例代码
Feb 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来处理多个提交任务
2008/05/08 PHP
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
python匿名函数的使用方法解析
2019/10/10 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
Linux上比较文件的命令都有哪些
2012/02/24 面试题
几个MySql的面试题
2013/04/22 面试题
搞笑婚礼主持词
2014/03/13 职场文书
大学生优秀班干部事迹材料
2014/05/26 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
七一建党日演讲稿
2014/09/05 职场文书
同乡会致辞
2015/07/30 职场文书
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL
浅谈如何保证Mysql主从一致
2022/03/13 MySQL
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android