先说一下deflate算法吧,deflate是zip压缩文件的默认算法, 其实deflate如今不光用在zip文件中, 在7z, xz等其余的压缩文件中都用, 实际上deflate只是一种压缩数据流的算法,任何须要流式压缩的地方均可以用。javascript
也就是说 zlib 格式, gzip 格式,是文件格式,deflate 是这些文件格式使用的压缩算法。php
deflate 压缩后是二进制,一般有两种传输方式:java
PHPgit
// 压缩,注意:其中 ZLIB_ENCODING_DEFLATE 参数是不能少的 $data = gzdeflate(json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 6, ZLIB_ENCODING_DEFLATE); // 使用 swoole 以二进制的方式发送 $webSocket->push($fd, $data, WEBSOCKET_OPCODE_BINARY);
JavaScriptgithub
// 消息事件 ws.onmessage = function(e) { // 转换前 console.log(e.data); // 开始转换 var blob = e.data; var reader = new FileReader(); reader.readAsBinaryString(blob); reader.onload = function (evt) { var data = pako.inflate(evt.target.result, { to: 'string' }) // 转换后 console.log(JSON.parse(data)) }; };
一般在 WebSoctet 不会使用这种方法,可是在接口或其余文本传输中会使用到。web
PHP + JavaScript算法
<script type='text/javascript'> const compressedDEFLATE = '<?php echo base64_encode(gzdeflate('Compress me', 6, ZLIB_ENCODING_DEFLATE )); ?>'; function atos(arr) { for (var i=0, l=arr.length, s='', c; c = arr[i++];) s += String.fromCharCode( c > 0xdf && c < 0xf0 && i < l-1 ? (c & 0xf) << 12 | (arr[i++] & 0x3f) << 6 | arr[i++] & 0x3f : c > 0x7f && i < l ? (c & 0x1f) << 6 | arr[i++] & 0x3f : c ); return s } console.log(atos(pako.ungzip(atob(compressedDEFLATE)))); </script>
安利一个基于 Swoole 的 WebSoctet 开发框架: MixPHPjson