实时通信:使用Spring Boot实现Websocket
在开发Web应用程序时,有时我们需要将服务器事件下推到已连接的客户端。 但是,HTTP并非旨在允许这样做。 客户端打开与服务器的连接并请求数据。 服务器不会打开与客户端的连接并推送数据。
为了解决此限制,建立了一种轮询模式,其中网页将间歇地轮询服务器是否有任何新事件。 这种模式不理想,因为它增加了HTTP开销,仅与轮询速率一样快,并在服务器上造成了不必要的负载。
幸运的是,随着HTML5的出现,WebSocket出现了。 WebSocket协议使浏览器和Web服务器之间的交互具有较低的开销。 在此博客中,我们将介绍Websockets API并展示如何使用Spring Boot实现Websockets。
抢救HTML5!
WebSocket通过浏览器和服务器之间的单个连接提供全双工通信。 它没有HTTP的开销,并允许服务器将消息实时推送到客户端。
WebSocket API实际上非常简单。 创建一个WebSocket
对象,附加事件侦听器,并发送消息。
这是一个例子:
var socket = new WebSocket('ws://' + window.location.host + '/my-websocket-endpoint');// Add an event listener for when a connection is open
socket.onopen = function() {console.log('WebSocket connection opened. Ready to send messages.');// Send a message to the serversocket.send('Hello, from WebSocket client!');
};// Add an event listener for when a message is received from the server
socket.onmessage = function(message) {console.log('Message received from server: ' + message);
};
Spring靴
Spring对与WebSockets的接口提供了出色的支持。
首先,我们需要创建一个扩展Spring类TextWebSocketHandler
类。
public class MyMessageHandler extends TextWebSocketHandler {@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {// The WebSocket has been closed}@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {// The WebSocket has been opened// I might save this session object so that I can send messages to it outside of this method// Let's send the first messagesession.sendMessage(new TextMessage("You are now connected to the server. This is the first message."));}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {// A message has been receivedSystem.out.println("Message received: " + textMessage.getPayload());}
}
接下来,我们需要配置WebSocket
端点。
@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {@Beanpublic WebSocketHandler myMessageHandler() {return new MyMessageHandler();}@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(myMessageHandler(), "/my-websocket-endpoint");}}
由于WebSockets API是纯JavaScript,因此您应该能够在大多数前端框架中使用它。 这包括Angular,因为您可以在TypeScript中直接包含JavaScript。
最后的想法
非常简单,它解决了服务器和客户端之间同时进行数据传输的麻烦。 Spring Boot使它变得更加容易。
想要看Websockets的实际应用吗? 在Keyhole,我们构建了一个开源工具Trouble Maker ,该工具将故障注入到我们的平台中,以便我们可以练习和测试使平台具有弹性的恢复机制。 Trouble Maker具有Angular前端,并利用WebSocket进行一些实时通信。 查看Github Repo尝试一下。
翻译自: https://www.javacodegeeks.com/2017/04/real-time-communication-implementing-websockets-spring-boot.html
实时通信:使用Spring Boot实现Websocket相关推荐
- spring boot 集成 websocket 实现消息主动推送
前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单向的,在很多场景就不适合,比如实时的推送,消息通知或者股票等信息 ...
- SpringBoot2.x系列教程(四十五)Spring Boot集成WebSocket实现技术交流群功能
在上篇文章中,我们了解了WebSocket的基本功能及相关概念.本篇文章中我们以具体的实例来演示,在Spring Boot中整合WebSocket,同时实现一个场景的业务场景功能. 针对在Spring ...
- Spring boot 实现 WebSocket服务端
Spring boot 实现 WebSocket服务端 这里写目录标题 Spring boot 实现 WebSocket服务端 声明 准备工作 1. 配置 2. WebSocket服务类 3. 编写客 ...
- Spring Boot 集成 WebSocket通信信息推送!
一.什么是websocket? WebSocket 协议是基于 TCP 的一种新的网络协议. 它实现了客户端与服务器之间的全双工通信,学过计算机网络都知道,既然是全双工,就说明了服务器可以主动发送信息 ...
- spring boot 使用 websocket tomcat刚启动就关闭到问题
因为没有任何日志打印(也可能是我logback配置的问题),翻百度谷歌到的好多文章也没有结论,翻阅官方文档中文翻译版,也没发现说明,再去看英文版,也没任何资料. 最后无奈只好调试进源码,首先找断点位置 ...
- java websocket注解_【websocket】spring boot 集成 websocket 的四种方式
集成 websocket 的四种方案 1. 原生注解 pom.xml org.springframework.boot spring-boot-starter-websocket WebSocketC ...
- Spring Boot 整合 WebSocket 使用记录
这里写自定义目录标题 前言 WebSocket 简介 WebSocket 客户端(javascript前端)实现 javascript 实现 window.location获取URL中各部分 http ...
- 基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID
我最近参与了一个项目,我们需要捕获Websocket请求的http会话ID –原因是要确定使用相同基础HTTP会话的Websocket会话的数量. 这样做的方法基于利用新的spring-session ...
- Spring Boot使用websocket实现聊天室
先看效果:这里面demo用的是原生js跟html,方便打包一体化,在效果上我更倾向于使用vue.react等进行页面开发 还有很多可以优化的点,目前的名字我直接使用的获取时间戳并且没有提供名字跟头像的 ...
最新文章
- linux agetty 登录框进程简介
- 一个专业处理字符串的IDEA插件
- Uploadify v3.2.1
- php获取xml某个节点的所有内容,怎样输出XML所有的同名节点内容?
- 图像风格迁移(Neural Style)简史
- kotlin 查找id_Kotlin程序查找Sphere的体积
- 行星齿轮设计_3D打印用于制造刚度平衡的行星架
- 编程语言python入门-2020年10月编程语言:Java、Python 龙争虎斗
- bootstrap popover弹框内容换行
- mysql数据库远程安装,Linux_15:解决远程安装数据库
- 启动startUML的时候报错“Exception EOleSysError in module StarUML.exe at 000AD559.
- 1. JDK版本变迁和各版本新特性
- D365 ERP流程笔记
- ie11安装程序无法继续 因为你的计算机,ie11无法安装解决方法详解
- 【树链剖分】月下毛景树
- vnc下:无法执行默认的终端模拟器
- 盗梦空间科普札记之一:梦里乾坤嵌套深,醒来可知在哪层?
- 企业邮箱登录入口首页是哪个,公共电子邮箱怎么申请注册?
- qt中socket编程
- 辅助驾驶事故频发,背后直指“决策安全模型”和驾驶员行为
热门文章
- JAVA实现汉字转换为拼音 pinyin4j/JPinyin
- Zookeeper面试题锦集
- 2020蓝桥杯省赛---java---B---10(整数小拼接)
- 81. 搜索旋转排序数组 II---Leecode----java
- browserquest php安装,请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker...
- 用python绘制图形_使用Python的turtle画炫酷图形
- jvm内存分配与收回策略
- 数据库死锁_死锁荔枝_解决方法
- jvm(2)-JVM内存的设置(解决eclipse下out of memory问题)
- java流与文件——读写二进制数据(DataOutput + DataInput)