第一种思路是 加载一张图片,通过的加载时长和图片的大小来计算出网络带宽
有了这个思路,我们可以参考如下代码:
function measureBW(fn) {
var startTime, endTime, fileSize;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if(xhr.readyState === 2){
startTime = Date.now();
}
if (xhr.readyState === 4 && xhr.status === 200) {
endTime = Date.now();
fileSize = xhr.responseText.length;
var speed = fileSize / ((endTime - startTime)/1000) / 1024;
fn && fn(Math.floor(speed))
}
}
xhr.open("GET", "https://upload.wikimedia.org/wikipedia/commons/5/51/Google.png", true);
xhr.send();
}
measureBW((speed)=>{
console.log(speed + " KB/sec"); //215 KB/sec
})
2、方法二
但是考虑到http请求需要建立连接,以及等待响应,这些过程也会消耗一些时间,所以以上的方法可能不会准确的检测出网络带宽。
我们可以同时发出多次请求,来减少http请求建立连接,等待响应的影响,参考如下代码:
function measureBW(fn,time) {
time = time || 1;
var startTime, endTime, fileSize;
var count = time ;
var _this = this;
function measureBWSimple () {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
if(!fileSize){
fileSize = xhr.responseText.length;
}
count --;
if(count<=0){
endTime = Date.now();
var speed = fileSize * time / ((endTime - startTime)/1000) / 1024;
fn && fn(Math.floor(speed));
}
}
}
xhr.open("GET", "https://upload.wikimedia.org/wikipedia/commons/5/51/Google.png", true);
xhr.send();
}
startTime = Date.now();
for(var x = time;x>0;x--){
measureBWSimple()
}
}
measureBW((speed)=>{
console.log(speed + " KB/sec"); //913 KB/sec
},10)
经测试,第二种方法得到的结果要比方法一得到的结果明显高出不少。
事实上,前两种还要额外设置 http 请求头来禁止使用本地缓存(开发测试下可以在控制台Network面板下点击禁用缓存),要不然图片加载一次后就不会在去服务器加载,自然也测不出网络的带宽.
在 Chrome65+ 的版本中,添加了一些原生的方法可以检测有关设备正在使用的连接与网络进行通信的信息。
参考如下代码,我们就可以检测到网络带宽:
function measureBW () {
return navigator.connection.downlink;
}
measureBW() ;
navigator.connection.downlink
会返回以(兆比特/秒)为单位的有效带宽估计值(参考MDN),这和我们常用的(KB/sec)有所差别,所以我们需要再做一下单位换算,参考如下代码:
function measureBW () {
return navigator.connection.downlink * 1024 /8; //单位为KB/sec
}
measureBW() ;
我们还可以通过 navigator.connection
上的 change
事件来监听网络带宽的变化:
navigator.connection.addEventListener('change', measureBW());
由于Java是基于Unicode编码的,因此,一个汉字的长度为1,而不是2。但有时需要以字节单位获得字符串的长度。例如,“123abc长城”按字节长度计算是10,而按Unicode计算长度是8。为了获得10,需要从头扫描根据字符的Ascii来获得具体的长度。如果是标准的字符,Ascii的范围是0至255,如果是汉字或其他全角字符,Ascii会大于255。因此,可以编写如下的方法来获得以字节为单位的字符串长度。
public int getWordCount(String s)
{
int length = 0;
for(int i = 0; i < s.length(); i++)
{
int ascii = Character.codePointAt(s, i);
if(ascii >= 0 && ascii <=255)
length++;
else
length += 2;
}
return length;
}
// 当然,也可以采用正则表达式来简化上面的方法,代码如下:
public int getWordCount(String s)
{
s = s.replaceAll("[^\\x00-\\xff]", "**");
int length = s.length();
return length;
}
// 上面代码的基本原理是将字符串中所有的非标准字符(双字节字符)替换成两个标准字符(**,或其他的也可以)。这样就可以直接例用length方法获得字符串的字节长度了。
//或者:
return String.getByte().length() ;
//注意可以输入参数
return String.getByte("gbk").length() ;