Java服务端限制下载速度

2023-11-20

没有资源取之不尽用之不竭。服务器带宽有限,能限制一点算一点。最近在使用云存储openstack swift做文件存储下载。如题先上限速code:

private Long writeResponse(HttpServletResponse response,InputStream stream, Long speed, Long startTime, MessageDigest md5) {
		byte[] b = null;
		b = new byte[SwiftFileDownload.Download_Read_Unit];
		try {
			OutputStream os = null;
			os = response.getOutputStream();
			long count = 0;
			int j;
			while ((j = stream.read(b)) != -1) {

				if (count + j > speed) {
					int need = (int) (speed - count);
					// 剩下的数
					int left = (int) (j + count - speed);
					byte[] temp = new byte[need];
					byte[] leftTemp = new byte[left];
					System.arraycopy(b, 0, temp, 0, need);
					System.arraycopy(b, need, leftTemp, 0, left);
					os.write(temp);
					md5.update(temp);
					os.flush();
					long endTime = System.currentTimeMillis();
					long sleepTime = startTime + 1000 - endTime;
					if (sleepTime > 0) {
						Thread.sleep(sleepTime);
					}

					startTime = System.currentTimeMillis();
					count = 0;
					os.write(leftTemp);
					md5.update(leftTemp);
					os.flush();
					count += left;
					continue;
				}

				if (count + j < speed) {
					count += j;
					byte[] temp = new byte[j];
					System.arraycopy(b, 0, temp, 0, j);
					os.write(temp);
					md5.update(b);
					os.flush();
					continue;
				}

				if (count + j == speed) {
					byte[] temp = new byte[j];
					System.arraycopy(b, 0, temp, 0, j);
					os.write(temp);
					md5.update(b);
					os.flush();
					long endTime = System.currentTimeMillis();
					long sleepTime = startTime + 1000 - endTime;
					if (sleepTime > 0) {
						Thread.sleep(sleepTime);
					}
					// 重置计数器
					startTime = System.currentTimeMillis();
					count = 0;
					continue;

				}
			}

		} catch (IOException e1) {
			log.warn("writeResponse() - response=" + response + ", IOException",e1);
			throw new BusinessSwiftException(e1);
		} catch (InterruptedException e) {
			log.warn("writeResponse() - response=" + response + ", IOException",e);
			throw new BusinessSwiftException(e);
		} finally {
			try {
				stream.close();
			} catch (IOException e) {
				log.warn("writeResponse() - 关闭swift对象流出错", e);
				throw new BusinessSwiftException(e);
			}
		}
		
		return startTime;

	}

主要的思想:一段时间内写一段数据流,暂停1秒减去读取与写出的所有操作的时间。实测在10%左右的浮动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java服务端限制下载速度 的相关文章

随机推荐

  • springboot跳转页面

    SpringBoot里面只有src目录 在src main resources下面有两个文件夹 static 和 templates springboot默认static中放静态页面 而templates中放动态页面 themleaf和fr
  • Egret游戏通用开发框架

    地址 https github com yicaoyimuys EgretGameEngine 简介 现在这套代码已经有几个项目都在使用了 主要用于各项目组间统一开发规范 便于开发人员调整 以及新手快速熟悉项目 支持Egret2 0 x和2
  • C#写的34401A串口232数据读取程序

    首先呢 请先设置惠普表为Talk only模式 也就是31 还不明白的自己查手册去 另外 各个表设置不一样 比如我这里2块表就不一样 一块是7位数据位 even校验 另一块是8位数据位 none校验 具体的可以看看表里的i o那里的设置 数
  • GPIO的两种引脚规则:BCM与BOARD

    树莓派 raspberry 针脚在python中BCM与BOARD模式的区别 在python程序中定义的GPI针脚有两种模式 BCM模式 BOARD模式 BCM模式 例如 GPIO setmode GPIO BCM 测试结果如下 物理针脚1
  • pycharm注释快捷键Ctrl+/

    行注释 取消行注释 Ctrl 块注释 Ctrl Shift
  • ArcGIS部分问题解决办法

    ArcGIS部分常见问题解决办法 最近在学习ArcGIS过程中 进行某些操作选项总是会会发生错误 不仅仅我自己一个人是这样 周围好多同学也是经常在操作的过程中报错 所以就很突发奇想把这段时间遇到的问题统一写下来 也是为了自己以后忘掉可以直接
  • 系统调用:用户级函数如何通过INT 80中断进入操作系统内核

    以printf 打印内核中的一段字符串为例 printf 是用户函数无法进入内核 因此需要进行系统调用 进入内核的方式是使用int 0x80中断 printf 函数想要进入系统内核是通过系统调用write 实现 位置 linux lib w
  • Usbkey原理介绍

    不好意思 百度来的 大家一起学习吧 文库中竟然收费5个币 Usbkey原理介绍 一 usbkey实现身份认证原理 采用冲击响应的认证方法 登录时在服务器端和客户端同时进行计算 客户端计算前要先验证USER PIN 通过后在硬件中使用HMAC
  • OD华为机试 23

    篮球比赛 描述 篮球 5V5 比赛中 每个球员拥有一个战斗力 每个队伍的所有球员战斗力之和为该队伍的总体战斗力 现有10个球员准备分为两队进行训练赛 教练希望2个队伍的战斗力差值能够尽可能的小 以达到最佳训练效果 给出10个球员的战斗力 如
  • docker搭建hadoop hdfs完全分布式集群

    1 制作hadoop镜像 参见 https www cnblogs com rmxd p 12051866 html 该博客中只参考制作镜像部分 固定IP及启动集群的部分应该跳过 这里注意 在做好的镜像里 要安装 which 工具 否则在执
  • DFS的个人理解和测试例题

    深度优先搜索 DFS 是一种搜索手段 可以理解为 它从某个位置 起点 开始 沿着一条路不断地向前走直到尽头 然后退后一步 去走其它没走过的路 没有的话 再退后一步 再去选择 直到找到目的地 终点 例如下图 从A 起点 开始走 先走ABD 在
  • 【MySQL】Ubuntu22.04安装MySQL8数据库详解

    00 目录 文章目录 00 目录 01 安装MySQL 02 配置MySQL 03 查看MySQL状态 04 登录MySQL数据库 05 问题讨论 06 附录 01 安装MySQL 1 1 更新软件源 deng local code 3li
  • MQTT.fx连接、订阅、发布OneNet平台(新版)

    第一步 打开MQTT fx 点击设置按钮 第二步 命名的话随便起 中文英文皆可以 token的下载地址 https open iot 10086 cn doc v5 develop detail 242 第三步 token生成密码 时间戳转
  • 数据结构之链表增删查改(最详细注释和最清晰思路,附完整代码)

    PZK学数据结构之链表 史上最详细思路和代码注释 完整代码我放在最后面了 可以直接跑 方便大家cv编程 文章目录 PZK学数据结构之链表 史上最详细思路和代码注释 完整代码我放在最后面了 可以直接跑 方便大家cv编程 前言 一 链表是什么
  • target属性里_blank _self _top _parent区别

    blank 是指超链接连接的网页 是通过一个新的网页窗口打开 self的话 是指在本身这个网页窗口来打开新的网页链接 top与 self差不很大 但是如果你用了时 就会知道两者的差别了 因为如果你的超链接是 做在 上时 如果用 self 点
  • broken pipe

    1 broken pipe的字面意思是 管道破裂 broken pip的原因是该管道的读端被关闭 2 broken pipe经常发生socket关闭之后 或者其他的描述符关闭之后 的write操作中 3 发生broken pipe错误时 进
  • Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

    Redis 列表List 集合Set 哈希Hash 有序集合 Zset 列表List 单键多值 常用命令 数据结构 Redis 集合 Set 常用命令 数据结构 Redis 哈希 Hash 常用命令 数据结构 Redis 有序集合 Zset
  • ElasticSearch

    ElasticSearch 一 ES介绍 ES是一款基于倒排索引的NoSQL数据库 传统数据库对于模糊查询存在性能瓶颈 而ES更擅长与大数据量的模糊查询 ES在存储数据的时候会先将数据进行分词 将分词的结果作为索引存入数据库中 当进行查询时
  • eclipse和myeclipse下main方法找不到主类的一种情况

    经常碰到java的main函数无法加载的问题 很多人就会以为是eclipse大姨妈了 然后疯狂的clean 疯狂的重启 其实不然 我们找到java build path找到下面的地方 看看路径是否指向编译后的class 需要注意的是 在ma
  • Java服务端限制下载速度

    没有资源取之不尽用之不竭 服务器带宽有限 能限制一点算一点 最近在使用云存储openstack swift做文件存储下载 如题先上限速code private Long writeResponse HttpServletResponse r