简码编程在使用aardio+hpsocket做websocket服务端的时候,
尝试向网页javaScript版的websocket客户端发送经过gzip压缩的内容,
但是发现导致网页的ws客户端断开连接了.
这是什么原因呢?
可能是经过gzip压缩的内容是二进制的,
里面的二进制乱码内容无法被网页ws客户端正确解析,
所以就导致ws断开连接了.
是不是可以让hpsocket在发送gzip压缩内容的时候设置应答头为gzip,
然后在网页ws客户端那边识别并解压接收到的gzip内容呢?
网上找到的资料说是可以的,
返回的是通过Gzip压缩后的二进制数据,是blob对象,需要使用pako.js进行gzip解压缩处理:
ws.socket.onmessage = res => {//ws接收到的数据
var blob = res.data//接收到的blob对象
var reader = new FileReader()
reader.readAsArrayBuffer(blob)//将blob对象数据转化成ArrayBuffer类数组
reader.onload = function(e){
if(e.target.readyState == FileReader.DONE){
let data = pako.inflate(reader.result)//使用pako.js将ArrayBuffer类数组转化成Uint8Array
strData = String.fromCharCode.apply(null, new Uint16Array(data))//转化成JSON字符串
console.log(JSON.parse(strData))
}
}
}
看起来挺复杂的,
而且pako.js不支持包含有中文字符的解压缩,
需要加一层转换为URL编码的处理,
所以我还是先收藏等有空了再测试这种方式吧.
我用的是另一种方式,
hpsocket的websocket服务端是明文发送json,
只有某一项是经过gzip压缩的,
而这一项压缩的乱码,
用base64进行转码变成正常的字符,
这样传到网页ws客户端后,
再把base64字符串转换回gzip编码进行解压缩,
实际应用过程中这样做是成功了的.
为什么我选择这种方式呢?
因为简单,好理解,
其它方式我折腾来折腾去,
为解决一个问题又会引发多个问题,
一生二,二生三,三生万物,
太折腾了,
能搞出一个成功的方式就先用着,
等有空了再去研究优化.
把gzip压缩内容进行base64转码后再发送,
优点是发送的是字符串明文而不是二进制乱码,
所以不用担心客户端解析错误造成各种问题,
缺点是gzip压缩内容进行base64转码后体积会大一点点,
如果ws客户端数量较多需要大规模发送的话,
会多消耗一些带宽资源.
不过没有什么问题是充值解决不了的,
要真是WS客户端数量多到需要充值解决的时候,
相信钱包也不会太小,充值也不是什么大问题了.