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中使用HTMLParser解析html实例
Feb 08 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
详解在Python和IPython中使用Docker
Apr 28 Python
图文详解WinPE下安装Python
May 17 Python
详解Python中的array数组模块相关使用
Jul 05 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
Python基于time模块表示时间常用方法
Jun 18 Python
Python实现弹球小游戏
Aug 01 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
深入浅析Django MTV模式
Sep 04 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
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
php集成开发环境详解
2019/09/24 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
javascript 的Document属性和方法集合
2010/01/25 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
Python给你的头像加上圣诞帽
2018/01/04 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
大学考试作弊检讨书
2014/01/30 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
工作求职信
2014/07/04 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技