一些理论知识

先说一下deflate算法吧,deflate是zip压缩文件的默认算法, 其实deflate现在不光用在zip文件中, 在7z, xz等其他的压缩文件中都用, 实际上deflate只是一种压缩数据流的算法,任何需要流式压缩的地方都可以用。

也就是说 zlib 格式, gzip 格式,是文件格式,deflate 是这些文件格式使用的压缩算法。

传输方式

deflate 压缩后是二进制,通常有两种传输方式:

  • 二进制
  • Base64编码

二进制

PHP

// 压缩,注意:其中 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);

JavaScript


// 消息事件
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))
};
};

Base64编码

通常在 WebSoctet 不会使用这种方法,但是在接口或其他文本传输中会使用到。

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 框架

安利一个基于 Swoole 的 WebSoctet 开发框架: MixPHP

原文地址:https://segmentfault.com/a/1190000016547663

最新文章

  1. 虚拟IP(VIP)
  2. JAVA Shallow heap & Retained heap
  3. Oracle的表锁死以及解锁
  4. java1.8函数式接口
  5. HDU5716 : 带可选字符的多字符串匹配
  6. 对​O​p​e​n​C​V​直​方​图​的​数​据​结​构​C​v​H​i​s​t​o​g​r​a​m​的​理​解
  7. HTML5 Geolocation 构建基于地理位置的 Web 应用
  8. centos下安装mysql遇到的问题
  9. & jobs fg Ctrl+z bg
  10. UVALive 6948 Jokewithpermutation dfs
  11. 转: js操作cookie
  12. HDU5196--DZY Loves Inversions 树状数组 逆序数
  13. grunt concat针对有依赖文件的js脚本的合并
  14. 再谈javascriptjs原型与原型链及继承相关问题
  15. OpenCV库框架结构
  16. Yii1.1.16学习记录
  17. Oracle 常用sql整理
  18. office2016选择性安装
  19. uva-167-枚举
  20. 03 Maven 坐标与依赖

热门文章

  1. [luogu4310] 绝世好题 (递推)
  2. 中国电信线CTF线下选拨writeup
  3. Linux 密码的暴力破解
  4. EhCache缓存页面、局部页面和对象缓存
  5. @PostConstruct 和 @PreDestroy 指定初始化和销毁方法
  6. C/C++ 文件路径解析
  7. EXPLAIN sql优化方法(3)DERIVED
  8. POJ 3177--Redundant Paths【无向图添加最少的边成为边双连通图 && tarjan求ebc && 缩点构造缩点树】
  9. Ural 1152 False Mirrors(状压DP)
  10. 王立平--Object-c