python:socket传输大文件示例


Posted in Python onJanuary 18, 2017

文件可以传输,但是对比传输前后的文件:socket_test.txt,末尾有一些不一致服务端代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import time
'''
等待连接
等待发送文件
读取数据
写入文件并且保存
等待连接
'''
import socket
import threading
import time
import struct


def function(newsock, address):
  FILEINFO_SIZE = struct.calcsize('128sI')
  '''定义文件信息(包含文件名和文件大小)大小。128s代表128个char[](文件名),I代表一个integer or long(文件大小)'''
  while 1:
    try:
      fhead = newsock.recv(FILEINFO_SIZE)
      filename, filesize = struct.unpack('128sI', fhead)
      '''把接收到的数据库进行解包,按照打包规则128sI'''
      print "address is: ", address
      print filename, len(filename), type(filename)
      print filesize
      #filename = 'new_'+filename.strip('\00') # 命名新文件new_传送的文件
      filename = filename.strip('\00')
      fp = open(filename, 'wb') # 新建文件,并且准备写入
      restsize = filesize
      print "recving..."
      while 1:
        if restsize > 102400: # 如果剩余数据包大于1024,就去1024的数据包
          filedata = newsock.recv(10240)
        else:
          filedata = newsock.recv(restsize)
          fp.write(filedata)
          #break
        if not filedata:
          break
        fp.write(filedata)
        restsize = restsize - len(filedata) # 计算剩余数据包大小
        if restsize <= 0:
          break
      fp.close()
      print "recv succeeded !!File named:", filename
    except Exception, e:
      print unicode(e).encode('gbk')
      print "the socket partner maybe closed"
      newsock.close()
      break
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建tcp连接
sock.bind(('10.240.146.82', 8887)) # 定于端口和ip
sock.listen(5) # 监听
while True:
  newsock, address = sock.accept()
  print "accept another connection"
  tmpThread = threading.Thread(target=function, args=(newsock, address)) # 如果接收到文件,创建线程
  tmpThread.start() # 执行线程
print 'end'

客户端代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
'''
输入文件名,并且上传
'''
import socket
import time
import struct
import os
f = open('socket_test.txt', 'wb')

for i in range(1000000):
  f.write('for socket test, the line number is : ' + str(i) + '\n')

f.close()

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(50)
e = 0
try:
  sock.connect(('10.240.146.82', 8887))
  print 'connect...'
except socket.timeout, e:
  print 'timeout', e
except socket.error, e:
  print 'error', e
except e:
  print 'any', e
if not e:
  #while (1):
    #filename = raw_input('input your filename------->') # 输入文件名
  filename = 'socket_test.txt'
  FILEINFO_SIZE = struct.calcsize('128sI') # 编码格式大小
  fhead = struct.pack('128sI', filename, os.stat(filename).st_size) # 按照规则进行打包
  sock.send(fhead) # 发送文件基本信息数据
  fp = open(filename, 'rb')
  fp2 = open('local_test.txt','wb')
  i = 0
  while 1: # 发送文件
    filedata = fp.read(10240)
    if not filedata:
      break
    sock.sendall(filedata)
    fp2.write(filedata)
    print i
    i = i + 1
  print "sending over..."
  fp.close()
  fp2.close()

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从零学Python之入门(五)缩进和选择
May 27 Python
Python入门篇之对象类型
Oct 17 Python
浅谈Python数据类型之间的转换
Jun 08 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
python微信公众号之关键词自动回复
Jun 15 Python
Python3爬虫全国地址信息
Jan 05 Python
java中的控制结构(if,循环)详解
Jun 26 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
Aug 22 Python
jenkins配置python脚本定时任务过程图解
Oct 29 Python
Python实现搜索算法的实例代码
Jan 02 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
pycharm 快速解决python代码冲突的问题
Jan 15 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 #Python
python实现下载整个ftp目录的方法
Jan 17 #Python
ansible作为python模块库使用的方法实例
Jan 17 #Python
python 基础教程之Map使用方法
Jan 17 #Python
Python获取某一天是星期几的方法示例
Jan 17 #Python
Python正则表达式匹配中文用法示例
Jan 17 #Python
python下如何查询CS反恐精英的服务器信息
Jan 17 #Python
You might like
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php Ajax乱码
2008/04/09 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
PHP分页类集锦
2014/11/18 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
js计数器代码
2006/11/04 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
js实现每日签到功能
2018/11/29 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
Python实现队列的方法
2015/05/26 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python解决字符串倒序输出的问题
2018/06/25 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
工程力学硕士生的自我评价范文
2013/11/16 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
医院营销工作计划
2015/01/16 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
升学宴家长答谢词
2015/09/29 职场文书
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers