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实现通过哈希算法检测图片重复的教程
Apr 02 Python
分析python切片原理和方法
Dec 19 Python
Python实现的redis分布式锁功能示例
May 29 Python
详解python项目实战:模拟登陆CSDN
Apr 04 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
Aug 22 Python
python3实现高效的端口扫描
Aug 31 Python
使用Python测试Ping主机IP和某端口是否开放的实例
Dec 17 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
python PIL模块的基本使用
Sep 29 Python
详解Python中string模块除去Str还剩下什么
Nov 30 Python
python 模拟在天空中放风筝的示例代码
Apr 21 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实现的折半查询算法示例
2017/10/09 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
强制设为首页代码
2006/06/19 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
js时间控件只显示年月
2017/01/08 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
解析Vue.js中的组件
2018/02/02 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Python检测网络延迟的代码
2018/05/15 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python RSA加密的示例
2020/12/09 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
软件工程师岗位职责
2013/11/16 职场文书
施工质量承诺书范文
2014/05/30 职场文书
银行工作心得体会范文
2016/01/23 职场文书
教你用python控制安卓手机
2021/05/13 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server