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使用add_subplot与subplot画子图操作示例
Jun 01 Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Python测试模块doctest使用解析
Aug 10 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
Tensorflow训练MNIST手写数字识别模型
Feb 13 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
Python 高效编程技巧分享
Sep 10 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
PyQt QMainWindow的使用示例
Mar 24 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 高手之路(一)
2006/10/09 PHP
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
jquery.validate分组验证代码
2011/03/17 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
Python编程中装饰器的使用示例解析
2016/06/20 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
Python中pillow知识点学习
2018/04/30 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
应届毕业生如何写求职信
2014/02/16 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
同意报考证明
2015/06/17 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server