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实现的百度站长自动URL提交小工具
Jun 27 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
python对离散变量的one-hot编码方法
Jul 11 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
Python多进程fork()函数详解
Feb 22 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
python实现PolynomialFeatures多项式的方法
Jan 06 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/05/21 PHP
PHP微信红包API接口
2015/12/05 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
js实现简单掷骰子小游戏
2019/10/24 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
Python中Random和Math模块学习笔记
2015/05/18 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
任意存:BOXFUL
2018/05/21 全球购物
一套VC试题
2015/01/23 面试题
linux面试题参考答案(7)
2014/07/24 面试题
高中竞选班长演讲稿
2014/04/24 职场文书
行政专员求职信范文
2014/05/03 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
Python加密与解密模块hashlib与hmac
2022/06/05 Python