1。前言Websocket是HTML5开始提供的一种在单TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换更加简单,允许服务器主动向客户端推送数据,当然也支持客户端向服务器发送数据。通常用于社交聊天、弹幕、多人游戏、协同编辑、实时股票基金行情、信息自动更新等场景,所以今天就简单说说Websocket在Java开发中的技术选型。技术选型就是结合自己的业务选择最合适的技术方案,没有褒贬之分。2.常用的Websocket技术2.1JavaWebsocket规范这是JavaEE提供的规范。在javax.websocket包下,它包括客户端API和服务器API。服务端API完全依赖于客户端API,只是增加了一些功能,所以只需要引入服务端依赖即可。具体实现需要Web容器、JavaEE服务器或框架提供。我们常用的web容器Tomcat、Undertow等都支持。优点:集成简单,原生Java支持。缺点:与web服务器等共享容器耦合度高,广播、组播需要自己控制。并发量低,调优麻烦,存在兼容性问题。2.2SockJSSockJS是一个对Websocket进行抽象的浏览器JavaScript库。SockJS为您提供一致的跨浏览器JavascriptAPI,在浏览器和Web服务器之间创建低延迟、全双工、跨域通信通道。SockJS尝试首先使用本机WebSockets。如果失败,它会尝试各种其他特定于浏览器的传输,例如xhr-streaming、服务器发送的事件和长轮询。它通常还与STOMP(面向消息的简单文本协议)结合使用以简化其使用。其实这个协议是在Spring的Websocket组件中使用的。优点:社区活跃,技术成熟,协议栈丰富,全套Spring解决方案,兼容性强,可结合发布订阅模式。缺点:需要学习SockJS和STOMP,断线重连,心跳检测,二进制支持差。2.3Socket.IOSocket.IO是一个基于Node.js的实时应用框架。广泛应用于即时通讯、通知和消息推送、实时分析等场景,但它提供了基于Netty的服务端实现和同时支持Websocket和长轮询的客户端实现。除了Websocket常见的场景,我们还可以使用该组件实现Android和IOS的消息推送。优点:性能好,支持广播、组播、断线重连、心跳检测、二进制。支持安卓和IOS平台。社区很活跃。缺点:需要自己封装与Spring的集成,服务器不由社区维护,资源消耗大。2.4ReactiveStream一些反应流规范和框架也实现了Websockets。SpringWebflux和RSocket就是代表。目前官方已经发布了一些相关的DEMO。优点:高吞吐量,高性能。缺点:技术比较新,学习资料少。3.总结这里不能给出更好的结论,也不可能。如果业务量很小,很急,可以试试第一种。SockJS和Socket.IO的争论点是后者在性能上更胜一筹,当然也消耗了大量资源,对移动端的推送功能支持更好。SockJS在Spring集成和整套解决方案上更有优势。如果追求高性能、高吞吐量的Websocket无疑更适合,但学习成本相对较高。其他小众技术这里不做评价。如果大家有更好的解决方案,可以留言讨论。附:PerformanceBenchmarkTest下面是一篇国外论文在2020年对原生Websocket、SockJS、Socket.IO进行的性能测试的一些关键指标,随着客户端数量的增加,创建连接的时间也会增加。随着客户端连接数的增加,接收消息的平均时间。接收消息消耗的连接数和重组的TCP段数。服务器的内存使用趋势。Dunizb本文转载自微信♂“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。
