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调用windows api锁定计算机示例
Apr 17 Python
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
详解Python中dict与set的使用
Aug 10 Python
django实现前后台交互实例
Aug 07 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
python实现猜单词游戏
May 22 Python
基于Python采集爬取微信公众号历史数据
Nov 27 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 截取utf-8格式的字符串实例代码
2016/10/30 PHP
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
2010/09/12 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
Python中请使用isinstance()判断变量类型
2014/08/25 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
python实现指定ip端口扫描方式
2019/12/17 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
internal修饰符起什么作用
2013/12/16 面试题
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
2015年环境整治工作总结
2015/05/22 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
css3带你实现3D转换效果
2022/02/24 HTML / CSS