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中fileno()方法的使用
May 24 Python
详解Python3中字符串中的数字提取方法
Jan 14 Python
Python之py2exe打包工具详解
Jun 14 Python
浅析Python3爬虫登录模拟
Feb 07 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Python collections模块使用方法详解
Aug 28 Python
python中pow函数用法及功能说明
Dec 04 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 Python
利用python实现后端写网页(flask框架)
Feb 28 Python
Pytorch 实现变量类型转换
May 17 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 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
cache_lite试用
2007/02/14 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
js处理包含中文的字符串实例
2017/10/11 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
Python中itertools模块用法详解
2014/09/25 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
详解python字节码
2018/02/07 Python
python中的colorlog库使用详解
2019/07/05 Python
Django 静态文件配置过程详解
2019/07/23 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
python 基于opencv实现图像增强
2020/12/23 Python
python 通过exifread读取照片信息
2020/12/24 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
九月份红领巾广播稿
2014/01/22 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
Python面向对象之成员相关知识总结
2021/06/24 Python