javascript 使用zlib发送wss请求,接收blob,并解压

使用了pako插件

/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */

主要代码:

var ws = new WebSocket("wss://yoururl");
            //连接成功时,触发事件
            ws.onopen = function () {                
                ws.send(binaryArray);
                console.log("数据发送中...");
            }
            //接收到服务端响应的数据时,触发事件
            ws.onmessage = function (res) {
				console.log("数据接收中...");
            }
            // 断开 web socket 连接成功触发事件
            ws.onclose = function () {
                console.log("连接已关闭...");
            };

完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<button id="btn" type="button">点我发送请求</button>
	</body>
	<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.4/pako.min.js"></script>
	<script type="text/javascript">
		$("#btn").click(function() {
			// 创建WebSocket 对象
			var ws = new WebSocket("wss://yoururl");
			//连接成功时,触发事件
			ws.onopen = function() {
				//请求参数
				var param = {
					"method": "test",
					"lang": "zh_CN",
					"token": "12345678",
					"cache": 0,
					"callbackId": "123",
					"version": 0.7
				};
				// 使用 send() 方法发送数据
				var str = JSON.stringify(param);
				var binaryArray = pako.deflate(str);
				ws.send(binaryArray);
				console.log("数据发送中...");
			}
			//接收到服务端响应的数据时,触发事件
			ws.onmessage = function(res) {
				console.log("数据接收中...");
				console.log("blob类型数据: " + res.data); //blob
				let reader = new FileReader();
				reader.readAsArrayBuffer(res.data, "utf-8");
				reader.onload = function() {
					console.log("blob转ArrayBuffer数据类型", reader.result);
					// 对数据进行解压
					let msg = JSON.parse(
						pako.inflate(reader.result, {
							to: "string"
						})
					);
					console.log("ArrayBuffer转字符串", msg);
				};
			}
			// 断开 web socket 连接成功触发事件
			ws.onclose = function() {
				console.log("连接已关闭...");
			};
		});
	</script>
</html>

服务器返回消息为blob类型,不能直接处理,报错Uncaught unknown compression method,需要转为arrayBuffer再进行解码

应答消息也可以使用Promise then()处理

ws.onmessage = function (evt) {
				console.log(evt.data);
				 new Response(evt.data).arrayBuffer().then(buffer=> {
					var result = JSON.parse(pako.inflate(buffer, { to: 'string' }));
					console.log(result);
					})
            }

另一种方案:

定义WebSocket同时指定传输字符类型,

var ws = new WebSocket("yoururl");		
ws.binaryType = "arraybuffer";

这样onmessage接收的就是arraybuffer,可以直接处理。

 ws.onmessage = function(e) {
				console.log(e.data);
				var str =pako.inflate(e.data, {	to: 'string'});
				console.log(str);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值