使用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制作获取网站目录的图形化程序
May 04 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
分析Python读取文件时的路径问题
Feb 11 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
Django学习笔记之为Model添加Action
Apr 30 Python
anaconda如何查看并管理python环境
Jul 05 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
详解用python生成随机数的几种方法
Aug 04 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
Django用户身份验证完成示例代码
Apr 03 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
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
php和html的区别点详细总结
2019/09/24 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
手写Vue2.0 数据劫持的示例
2021/03/04 Vue.js
Python语言描述随机梯度下降法
2018/01/04 Python
Python语言的变量认识及操作方法
2018/02/11 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
简约控的天堂:The Undone
2016/12/21 全球购物
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
怀念母亲教学反思
2014/04/28 职场文书
心理健康活动总结
2014/04/30 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
文明单位创建材料
2014/12/24 职场文书
综合实践活动报告
2015/02/05 职场文书
高中社区服务活动报告
2015/02/05 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
工作感想范文
2015/08/07 职场文书
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL