使用python socket分发大文件的实现方法


Posted in Python onJuly 08, 2019

思路:

使用socket传输文件过程中,如果单次传输每次只能发送一部分数据,如果针对大文件,一次传输肯定是不行的,所以需要我们在传输的时候提前把传输内容的大小先发送给客户端,在客户端循环接收数据即可。

代码部分:

一、服务器

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#environment:2.7

import os,json,time,socket
sk = socket.socket()
ip_port=('127.0.0.1',9600)
sk.bind(ip_port)
sk.listen(5)
file_path = '/root/update/123.txt'
file_name = file_path.rsplit(os.sep,1)[1] 
file_size = os.path.getsize(file_path)  #获取文件内容大小
#发送给客户端的头部信息
header_data = {
  'file_name': file_name,
  'file_size': file_size,
  'date': time.strftime('%Y-%m-%d %X',time.localtime()),
  'charset': 'utf-8'
}
while True:
  conn, addr = sk.accept()
  print("%s:%s is connect"% addr)
  request_data = conn.recv(1024)
  print(request_data)
  # 把头部内容发送过去
  conn.send(json.dumps(header_data))
  request_data1 = conn.recv(1024)
  print(request_data1)
  f = open(file_path,'r')
  content = f.read()
  #发送文件内容
  conn.sendall(content)
  conn.close()

二、客户端

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#environment:2.7

import socket,json
while True:
  sk = socket.socket()
  ip_port = ('127.0.0.1',9600)
  sk.connect(ip_port)
  user_input = raw_input('>>>:').strip()
  if len(user_input) == 0:continue
  if user_input == 'q':break
  sk.send(user_input)
  server_head_msg = json.loads(sk.recv(1024))
  print(server_head_msg)
  #文件名res_name,文件大小res_size
  res_name = server_head_msg['file_name']
  res_size = server_head_msg['file_size']
  sk.send('已经收到头部信息,你可以发送数据了')
  #下面是循环接收文件内容的部分
  num = res_size/1024.0
  if num != int(num):
    num = int(num) +1
  else:
    num = int(num)
  for i in range(num):
    content = sk.recv(1024)
    print(content)

备注:在接收服务器端发送来的文件也按照判断每次接收数据的大小来考虑,大致思路如下

res = ''
recive_size = 0
while recive_size <= res_size:
  data = sk.recv(1024)
  recive_size += len(data)
  res += data
else:
  print(res)
  print('done'.center(40,'='))

以上这篇使用python socket分发大文件的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python的Django框架中的中间件
Jul 24 Python
python实现按行切分文本文件的方法
Apr 18 Python
python音频处理用到的操作的示例代码
Oct 27 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
python 消除 futureWarning问题的解决
Dec 25 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
详解scrapy内置中间件的顺序
Sep 28 Python
python查看文件大小和文件夹内容的方法
Jul 08 #Python
python 搜索大文件的实例代码
Jul 08 #Python
代码实例讲解python3的编码问题
Jul 08 #Python
Python参数类型以及常见的坑详解
Jul 08 #Python
python里运用私有属性和方法总结
Jul 08 #Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 #Python
python字符串查找函数的用法详解
Jul 08 #Python
You might like
php调用mysql数据 dbclass类
2011/05/07 PHP
获取URL文件名后缀
2013/10/24 PHP
php数组去重实例及分析
2013/11/26 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
理解JavaScript的prototype属性
2012/02/11 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
Python中分数的相关使用教程
2015/03/30 Python
Python中的变量和作用域详解
2016/07/13 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
python 把列表转化为字符串的方法
2018/10/23 Python
Python实现元素等待代码实例
2019/11/11 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
应届生会计求职信
2013/11/11 职场文书
毕业生大学生活自我总结
2014/01/31 职场文书
公司晚会主持词
2014/03/22 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
文明旅游倡议书
2015/04/28 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS