有思俱乐部学习园地

soket.io


soket.io综述

socket.io出来很多年了,然应用范围不太广泛,本文做一些实验性的应用,宗旨是使用node+sokcetio+redis构建一套分布式的可多人在线的系统。网易以前做了一套架构叫pomelo,也有java架构netty,欢迎大家一起研究.
                微博webim、微信网页版都用了长轮询方案,而不是长连接,所以此处只做研究使用。
                

微信长轮询初探

  截至2018年4月11日,微信网页版还是使用长轮询方案,但是此方案有他自己的机制。可通过Chrome分析可得:
                  1.进入和一个人的对话页面后,会发起以“ttps://http://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=”开头的get请求。这是一个长轮询,服务端不会立马返回;
                  2.如果25s后对方未给你发消息,服务端会返回一段js代码“window.synccheck={retcode:"0",selector:"0"}”之类,这一个get请求结束,网页会重新发起长轮询;以此往复;
                  3.如果对方发给你消息,服务端立马会返回该get请求,返回内容是一段js代码“window.synccheck={retcode:"0",selector:"2"}”;
                  4.网页根据这段代码,发起新的post请求,获取刚才对方发来的消息;
                  5.如果你主动给对方发消息,会产生一些新的post请求(我观察到两条post,一个是应该是用于消息传输给服务器,一个是通知服务器同步的,可能),然后服务器会立马返回1中的get请求,反馈内容为“window.synccheck={retcode:"0",selector:"2"}”;
                  6.和4类似,网页根据这段代码,发起新的post请求,但返回的消息我没有观察到有效的payload,不知道5为何返回这段js。以上是网页版微信通信的大致流程。个人认为,以长轮询为基础,但增加了自定义的机制(每25s发起新的长轮询),能够简单有效保证网页端的IM,降低了客户端的复杂度,也不会给服务端带来性能上的巨大压力。
                  此处为网上摘抄,没有验证。
                

工作人员

 
                    
作者:XXX
信息录入:XXX
文案编辑:XXX
视频录制:XXX
视频编辑:XXX
图片编辑:XXX