默认
打赏 发表评论 6
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
MobileIMSDK-Web的网络层框架为何使用的是Socket.io而不是Netty?
微信扫一扫关注!

1、关于MobileIMSDK-Web


MobileIMSDK-Web是轻量级Web端即时通讯框架,纯JS编写、高度提炼,基于socket.io技术,适用于移动端和PC端网页聊天或消息推送。MobileIMSDK-Web的设计目标是以对浏览器的最大兼容性,来实现Web端的即时通讯技术,从而使得MobileIMSDK-Web可以工作于更多的Web端场景下。有关MobileIMSDK-Web的详细介绍请见《轻量级Web端即时通讯框架:MobileIMSDK-Web基本介绍》。

本文要讨论的是MobileIMSDK-Web的网络层框架为何使用的是Socket.io而不是Netty,我们继续看正文。

2、什么是Socket.io?


01a5bbc7aaa24bb696ba7dd8de477033.jpg

Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js。Socket.IO除了支持WebSocket通讯协议外,还支持许多种轮询(Polling)机制以及其它实时通信方式,并封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。Socket.IO实现的Polling通信机制包括Adobe Flash Socket、AJAX长轮询、AJAX multipart streaming、持久Iframe、JSONP轮询等。Socket.IO能够根据浏览器对通讯机制的支持情况自动地选择最佳的方式来实现网络实时应用。当前,Socket.IO最新版本是于2015年1月19日发布的1.3.0版本,该版本增强了稳定性和提高了性能,并修复了大量Bug。

Socket.IO设计的目标是构建能够在不同浏览器和移动设备上良好运行的实时应用,如实时分析系统、二进制流数据处理应用、在线聊天室、在线客服系统、评论系统、WebIM等。目前,Socket.IO已经支持主流PC浏览器(如IE、Safari、Chrome、Firefox、Opera等)和移动平台上的浏览器(iOS平台下的Safari、Android平台下的基于Webkit的浏览器等)。

一句话介绍Socket.io就是:Socket.io是一个可以兼容几乎市面上所有浏览器的Web端即时通讯网络层框架,WebSocket协议只是其支持的数据传输方式的一种,内置支持了几乎所有Web端长连接方案,而这些方案何时启用全是它自动决定,且上层API对用户是透明的,用户无需处理兼容性问题。

有关Socket.io的详细介绍请见《Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架》。如果您对Web端即时通讯技术不太了解,则这里有您需要的所有资料:http://www.52im.net/forum.php?mod=collection&action=view&ctid=15

3、什么是Netty?


Netty 是一个基于 Java NIO 类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。

NIO框架的流行,使得开发大并发、高性能的Java互联网服务端成为可能。这其中最流行Java NIO框架的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3Netty4Netty5已经被取消开发了详见此文)。

而Netty在最新版本中,已经内置了对WebSocket协议的支持,而WebSocket协议属于HTML5标准的一部分(有关WebSocket的介绍请见《新手快速入门:WebSocket简明教程),这也就意味着可以基于Netty编写WebSocket的服务端,从而在支持HTML5的浏览器里实现Web端即时通讯。

有关Netty的更多技术资料,请见:
有关“为何选择Netty”的11个疑问及解答
开源NIO框架八卦——到底是先有MINA还是先有Netty?
选Netty还是Mina:深入研究与对比(一)
选Netty还是Mina:深入研究与对比(二)
NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示
NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
Netty 4.x学习(一):ByteBuf详解
Netty 4.x学习(二):Channel和Pipeline详解
Netty 4.x学习(三):线程模型详解
Apache Mina框架高级篇(一):IoFilter详解
Apache Mina框架高级篇(二):IoHandler详解
MINA2 线程原理总结(含简单测试实例)
Apache MINA2.0 开发指南(中文版)[附件下载]
MINA、Netty的源代码(在线阅读版)已整理发布
解决MINA数据传输中TCP的粘包、缺包问题(有源码)
解决Mina中多个同类型Filter实例共存的问题
实践总结:Netty3.x升级Netty4.x遇到的那些坑(线程篇)
实践总结:Netty3.x VS Netty4.x的线程模型
详解Netty的安全性:原理介绍、代码演示(上篇)
详解Netty的安全性:原理介绍、代码演示(下篇)
详解Netty的优雅退出机制和原理
NIO框架详解:Netty的高性能之道
Twitter:如何使用Netty 4来减少JVM的GC开销(译文)
绝对干货:基于Netty实现海量接入的推送服务技术要点
Netty干货分享:京东京麦的生产级TCP网关技术实践总结
>> 更多同类文章 ……

4、理由1——浏览器兼容性


Netty是基于WebSocket协议实现网页端跟Netty后端的即时通讯的,那么我们来对比一下WebSocket和Socket.io的浏览器端兼容性。

▼ 先看看Socket.io的浏览器兼容性情况:
192951wq5q2q3gepk17h7z.png
(详见《轻量级Web端即时通讯框架:MobileIMSDK-Web基本介绍》一文中的“七、技术特征”一节。)

▼ 再来看看WebSocket的浏览器兼容性情况:
333.jpg
(统计数据来源于:https://caniuse.com/#feat=websockets

▼ 浏览器兼容性解读:
根据上面的兼容情况统计,以IE浏览器为例,Socket.io最低可以兼容低至IE6这样的老古董,而WebSocket需要至少IE10及以上版本的浏览器才行。这也就意味着基于Socket.io的即时通讯通讯方案拥有比Netty这样的方案好的多的浏览器兼容性,这在一些希望最大限度容忍用户的低版本浏览器的场景下(比如客服系统)显的非常有用。

5、理由2——浏览器端方案支持


其实,Netty(或者说Tomcat7、Jetty等)这些方案能提供的仅仅是服务端的WebSocket技术实现,而浏览器端的方案是需要开发者基于各家浏览器自行编写WebSocket代码来实现(就像当初用Ajax时候那样)。

Socket.io这样方案最大好处是,它提供的不仅仅是服务端方案,还包括配套的一站式(解决了各种浏览器型号适配、版本兼容等)的浏览器端库实现

假设我们的方案所运行的浏览器版本都支持WebSocket(不考虑低版本不支持WebSocket的情况),但即使这样,各家浏览器依然会存在或多或少的区别,就像当初Ajax所面临的问题是一样的道理——理想很完美但现实是该适配还得适配,一套代码并不能毫不修改地就能在所有浏览器上如期运行。

我们来感受一下另一套浏览器端方案SocketJS在浏览器端所做的努力:
2222.png

正如上图所示,SocketJS这样的浏览器端即时通讯方案需要针对不同厂商、不同版本的浏览器自动决定该使用何种实时通信方案来实现真正的Web端即时通讯,而这图上的内容和做过的努力还不是全部。那么,您是否已经感受到适配和兼容性问题的棘手。而Socket.io提供的浏览器端解决方案,也同样解决好了这些问题,甚至做的更好。

6、理由3——商业案例


我们在对一种技术进行方案选型时,如果能有成熟的商业产品作为案例来作为佐证,那么至少说明在生产环境下证明它是可行的、可以用生产环境的(先不谈它是否是最佳选择)。

▼ 如下图所示,网易云信商用Web端用的就是socket.io :
111.png

▼ 号称中国的Zendesk的逸创云客服,用的也同样是socket.io :
2222.png

▼ 同样来自网易的开源Web端游戏框架Pomelo也使用了Soclet.io技术:
2012112816134667.jpg
(Pomelo的介绍请见《Pomelo:网易开源基于 Node.js 的游戏服务端框架》)

其它有关Socket.io的例子就不一一列举。但有关基于Netty的Web端即时通讯商用方案从公开的场合来看,虽然见到的比较少,但也并不能说它不能用于商用环境,但至少我们看到了Socket.io的商用成熟性和普及性。

7、总结一下


如果我要来开发Web端即时通讯方案,我该怎么选择?

  • 1)如果您的Web端即时通讯系统希望尽可能多地兼容更多浏览器(包括手机端浏览器),则可以考虑使用Socket.io这样的Web端网络层方案(就像MobileIMSDK-Web的选择一样);
  • 2)如果您的Web端即时通讯系统只需要运行在支持HTML5的浏览器上(诸如IE10及以上版本的新式浏览器上)时,您可以选择实现了WebSocket的Netty这样的服务端方案来开发:
    以Java语言为例,实际上支持WebSocket的服务端方案不只有Netty这样的NIO框架,包括Tomcat7、Jetty等主流的Java Web容器也有对WebSocket的支持(如果我们不考虑高并发、高负载的话)。

针对上述文字,您已经理解MobileIMSDK-Web为何使用Socket.io作为网层底层库了吧?
是的,MobileIMSDK-Web的设计目标就是为了更大程度地在低版本地浏览器上实现Web即时通讯技术,所以选择了Socket.io。而这也就意味着MobileIMSDK-Web可以更广泛地应用于Web关即时通讯场景,包括但不限于:Web端客服系统、Web推送系统、Web端OA系统等各种Web端实时通信业务中。

附录:延伸阅读


如果您对Web端即时通讯技术的基础、原理、历史、技术历程不太了解的话,这里有您需要的所有资料:
新手入门贴:史上最全Web端即时通讯技术原理详解
Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
SSE技术详解:一种全新的HTML5服务器推送事件技术
Comet技术详解:基于HTTP长连接的Web端实时通信技术
新手快速入门:WebSocket简明教程
WebSocket详解(一):初步认识WebSocket技术
WebSocket详解(二):技术原理、代码演示和应用案例
WebSocket详解(三):深入WebSocket通信协议细节
socket.io实现消息推送的一点实践及思路
LinkedIn的Web端即时通讯实践:实现单机几十万条长连接
Web端即时通讯技术的发展与WebSocket、Socket.io的技术实践
Web端即时通讯安全:跨站点WebSocket劫持漏洞详解(含示例代码)
开源框架Pomelo实践:搭建Web端高性能分布式IM聊天服务器
使用WebSocket和SSE技术实现Web端消息推送
详解Web端通信方式的演进:从Ajax、JSONP 到 SSE、Websocket
MobileIMSDK-Web的网络层框架为何使用的是Socket.io而不是Netty?
>> 更多同类文章 ……

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

本帖已收录至以下技术专辑

推荐方案
评论 6
网页端的东西了解不多,先收藏
签名: 秋天到了,终于凉快了
为啥不能socket.io做前端,netty做后端。
难道sockei.io地后端一定是node.js吗
引用:austin 发表于 2018-01-08 19:01
为啥不能socket.io做前端,netty做后端。
难道sockei.io地后端一定是node.js吗

正如我在文章中写的,Socket.io是包含浏览器端和服务端一体的解决方案,而且Socket.io支持的不仅是WebSocket,它还包含WebSocket未问世前的所有主流Web端即时通讯技术实现(包括长轮询、Comet等等),目的是支持低版本的浏览器。

而且正如Socket.io的官方所言,Socket.io支持WebSocket但并不是原生的WebSocke API的简单封装,它包含了自已的一整套算法:包括断线重连、心跳保持等等,所以如果你用Socket.io的浏览器端库作为客户端,用netty作服务端,那么Socket.io自有的一些算法怎么办呢?而netty仅仅是支持最原生的WebSocket协议而已,并不支持协议之外的Socket.io自有的算法逻辑。
非常感谢~
引用:JackJiang 发表于 2018-01-08 22:24
正如我在文章中写的,Socket.io是包含浏览器端和服务端一体的解决方案,而且Socket.io支持的不仅是WebSoc ...

恩恩
感谢分享
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部