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 相关文章推荐
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
Python3进制之间的转换代码实例
Aug 24 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
Jan 09 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
没编程基础可以学python吗
Jun 17 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
详解Python IO编程
Jul 24 Python
Python colormap库的安装和使用详情
Oct 06 Python
python热力图实现简单方法
Jan 29 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 构造函数construct的前下划线是双的_
2009/12/08 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
浅谈PHP进程管理
2019/03/08 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
js实现小星星游戏
2020/03/23 Javascript
介绍Python中的一些高级编程技巧
2015/04/02 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
python 类之间的参数传递方式
2019/12/20 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
pytorch数据预处理错误的解决
2020/02/20 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
cf收人广告词
2014/03/14 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
基层党员公开承诺书
2014/05/29 职场文书
公司委托书范本5篇
2014/09/20 职场文书
就业协议书范本
2014/10/08 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
入党申请书怎么写?
2019/06/11 职场文书
详解SQL的窗口函数
2022/04/21 Oracle
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python