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不规范的日期字符串处理类
Jun 10 Python
Python中使用PDB库调试程序
Apr 05 Python
进一步探究Python的装饰器的运用
May 05 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
pandas 空数据处理方法详解
Nov 02 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
python根据字典的键来删除元素的方法
Aug 16 Python
python tqdm实现进度条的示例代码
Nov 10 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 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
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
Vue 项目代理设置的优化
2018/04/17 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
python时间整形转标准格式的示例分享
2014/02/14 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
python实现textrank关键词提取
2018/06/22 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
在python shell中运行python文件的实现
2019/12/21 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
大学生自我评价范文分享
2014/02/21 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
无毒社区工作方案
2014/05/23 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL