1. 前言

WebsocketHTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,当然也支持客户端发送数据到服务端。通常用来社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、资讯自动更新等场景,那么今天就简单聊一下在Java开发中对Websocket的技术选型。

技术选型是结合自身业务选择最适合的技术方案,并不存在褒贬。

2. 常用的Websocket技术

2.1 Java Websocket规范

这是JavaEE提供的规范,在包javax.websocket下,包含客户端API和服务端API,服务端API完全依赖于客户端API,只是在其基础上添加了一些功能,所以只需要导入服务端依赖即可。 具体实现需要Web容器、JavaEE服务器或者框架提供。我们常用的Web容器TomcatUndertow等都支持。

优点:集成起来简单,原生的Java支持。

缺点:和Web服务器等共享容器耦合度高,广播、组播需要自行控制。并发量较低,调优麻烦,存在兼容性问题。

2.2 SockJS

SockJS是一个浏览器JavaScript库,对Websocket进行了抽象。SockJS为您提供了一个一致的,跨浏览器的Javascript API,该API在浏览器和Web服务器之间创建了低延迟,全双工,跨域的通信通道。SockJS尝试首先使用本机WebSockets。如果失败了,它将尝试其它各种特定于浏览器的传输协议,例如xhr-streamingServer sent events 以及长轮询等。通常也会配合STOMP(面向消息的简单文本协议)来简化其使用。其实Spring Websocket组件中采用的就是此协议。

优点:社区活跃,技术成熟,协议栈丰富,有全套Spring解决方案,兼容性强,另外可以结合发布订阅模式。

缺点:需要对SockJS和STOMP进行学习,断线重连、心跳检测、二进制支持不好。

2.3 Socket.IO

Socket.IO 是一个基于 Node.js 的实时应用程序框架,在即时通讯、通知与消息推送,实时分析等场景中有较为广泛的应用,但是它提供基于Netty的服务端实现以及客户端实现,同时支持Websocket和长轮询。除了Websocket的常用场景外,我们可以通过该组件实现安卓和IOS的消息推送。

优点:性能良好,支持广播、组播,断线重连、心跳检测、二进制。支持安卓和IOS平台。社区活跃。

缺点:需要自行封装同Spring的集成,服务端并非社区维护,资源消耗大。

2.4 ReactiveStream

一些反应流规范和框架也对Websocket进行了实现。Spring WebfluxRSocket就是其中的代表,目前官方已经放出了一些相关的DEMO。

优点:高吞吐量、高性能。

缺点:技术比较新、学习资料少。

3. 总结

如果业务量非常少而且非常急迫的话第一种可以尝试一下。SockJSSocket.IO的争论点在于性能上后者要好一些,当然资源也消耗大,对移动端的推送功能支持更好一些。在Spring整合上以及全套解决方案上SockJS更具优势。如果追求高性能、高吞吐量的Websocket那么无疑反应式更加合适,但是学习成本也相对较高。其它小众的技术这里不做评测,如果你有比较好的方案可留言讨论。

附:性能基准测试

以下是国外某论文在2020年对原生WebsocketSockJSSocket.IO进行的性能测试的一些关键指标。

英文完整版评测报告可通过公众号 码农小胖哥 回复 ws获取。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

常用的Websocket技术一览的更多相关文章

  1. HTML5 WebSocket 技术介绍

    WebSocket是html5规范新引入的功能,用于解决浏览器与后台服务器双向通讯的问题,使用WebSocket技术,后台可以随时向前端推送消息,以保证前后台状态统一,在传统的无状态HTTP协议中,这 ...

  2. WebSocket技术

    webSocket技术 在html5技术革新中,加入了WebSocket技术 1.webSocket实际是TCP连接 webSocket在最初将发送http连接请求到服务器端, 但是在header中加 ...

  3. 对WebSocket技术的学习与探索(二)

    近日重新开始学习WebSocket技术,什么是WebSocket,在<对WebSocket技术的学习与探索(一)>文章中已经说明白了,还没理解可以看看这篇文章http://www.ruan ...

  4. iOS9 3DTouch、ShortcutItem、Peek And Pop技术一览

    [iOS]iOS9 3DTouch.ShortcutItem.Peek And Pop技术一览   3DTouch UITouch类里API的变化 iOS9中添加的属性 altitudeAngle 当 ...

  5. WebSocket详解(一):初步认识WebSocket技术

    1.什么是Socket?什么是WebSocket? 对于第1次听说WebSocket技术的人来说,两者有什么区别?websocket是仅仅将socket的概念移植到浏览器中的实现吗? 我们知道,在网络 ...

  6. 基于Springboot后台,前台 vue.js 跨域 Activiti6 工作流(用到websocket技术) 的项目

    工作流模块----------------------------------------------------------------------------------------------- ...

  7. 简易集成websocket技术实现消息推送

    Websocket 简介 首先介绍下WebSocket,它是一种网络通信技术,该技术最大的特点就是,服务器端可以主动往客户端发送消息:当然,客户端也可以主动往服务器发送消息,实现两端的消息通信,属于网 ...

  8. 基于.NET平台常用的框架技术整理

    个人整理 部分收藏于:http://www.cnblogs.com/hgmyz/p/5313983.html 自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线 ...

  9. [Java,JavaEE] 最常用的Java库一览

    引用自:http://www.importnew.com/7530.html 本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入Java小组.转载请参见文章末尾的要求. ...

随机推荐

  1. javaSE总结(转+总结)

    一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java ...

  2. 前端面试?这份手撸Promise请你收下

    前言 现在很多大厂面试前端都会要求能够手动的写出一个Promise,所以这里整理了一份手写的Promise. 绝对详细,功能绝对强大.如果你不了解Promise的基本使用,那么本篇文章可能不太适合你, ...

  3. node-sass 报错的解决方法

    今天在运行项目发现原来好好的项目报错了.报错大致信息如下: 这段代码是我升级node之后里面根据不同的项目位置什么的会有所不同. 简单的说,这段代码意思是node-sass 不兼容 node v8 的 ...

  4. Mysql多条数据以一条展示和判断某字符是否在某字段

    多条数据以一条数据展示:GROUP_CONCAT select GROUP_CONCAT(uuid) from user; 判断某字符是否存在某字段:INSTR select * from( sele ...

  5. Datawhale学数据分析第一章

    需要用到的基础知识pandas基础知识参考1,2章https://github.com/datawhalechina/joyful-pandas 1.导入数据tsv 制表符作为分隔符的字段符csv 逗 ...

  6. Windows server 2008R2 中sql server的搭建

    一.安装sql server Step1:下载sql server 2008 r2 standard,解压到Windows的C:\下. Step2:打开安装程序,进行sql server的安装 Ste ...

  7. 文章目录&友情链接

    文章目录&友情链接 1:<公告:本博客开始写博文了> 2.本人网络图书馆

  8. C++ Templates (1.6 但是为什么不...? But, Should't We ...?)

    返回完整目录 目录 1.6 但是为什么不...? But, Should't We ...? 1.6.1 传值还是传引用? Pass by Value or by Reference? 1.6.2 为 ...

  9. pypcap rpm制作

    1.下载地址 https://pypi.org/project/pypcap/#history 2.下载后,解压并制作rpm tar -xvf pypcap-1.2.3.tar.gz python s ...

  10. SecureCRT 关键字高亮显示

    grep命令红色高亮关键字 1.  左边侧栏 Session Manage 右键Sessions --Properties 2 Terminal--Appearance Current color s ...