在开发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相关推荐

  1. spring boot 集成 websocket 实现消息主动推送

    前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单向的,在很多场景就不适合,比如实时的推送,消息通知或者股票等信息 ...

  2. SpringBoot2.x系列教程(四十五)Spring Boot集成WebSocket实现技术交流群功能

    在上篇文章中,我们了解了WebSocket的基本功能及相关概念.本篇文章中我们以具体的实例来演示,在Spring Boot中整合WebSocket,同时实现一个场景的业务场景功能. 针对在Spring ...

  3. Spring boot 实现 WebSocket服务端

    Spring boot 实现 WebSocket服务端 这里写目录标题 Spring boot 实现 WebSocket服务端 声明 准备工作 1. 配置 2. WebSocket服务类 3. 编写客 ...

  4. Spring Boot 集成 WebSocket通信信息推送!

    一.什么是websocket? WebSocket 协议是基于 TCP 的一种新的网络协议. 它实现了客户端与服务器之间的全双工通信,学过计算机网络都知道,既然是全双工,就说明了服务器可以主动发送信息 ...

  5. spring boot 使用 websocket tomcat刚启动就关闭到问题

    因为没有任何日志打印(也可能是我logback配置的问题),翻百度谷歌到的好多文章也没有结论,翻阅官方文档中文翻译版,也没发现说明,再去看英文版,也没任何资料. 最后无奈只好调试进源码,首先找断点位置 ...

  6. java websocket注解_【websocket】spring boot 集成 websocket 的四种方式

    集成 websocket 的四种方案 1. 原生注解 pom.xml org.springframework.boot spring-boot-starter-websocket WebSocketC ...

  7. Spring Boot 整合 WebSocket 使用记录

    这里写自定义目录标题 前言 WebSocket 简介 WebSocket 客户端(javascript前端)实现 javascript 实现 window.location获取URL中各部分 http ...

  8. 基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID

    我最近参与了一个项目,我们需要捕获Websocket请求的http会话ID –原因是要确定使用相同基础HTTP会话的Websocket会话的数量. 这样做的方法基于利用新的spring-session ...

  9. Spring Boot使用websocket实现聊天室

    先看效果:这里面demo用的是原生js跟html,方便打包一体化,在效果上我更倾向于使用vue.react等进行页面开发 还有很多可以优化的点,目前的名字我直接使用的获取时间戳并且没有提供名字跟头像的 ...

最新文章

  1. linux agetty 登录框进程简介
  2. 一个专业处理字符串的IDEA插件
  3. Uploadify v3.2.1
  4. php获取xml某个节点的所有内容,怎样输出XML所有的同名节点内容?
  5. 图像风格迁移(Neural Style)简史
  6. kotlin 查找id_Kotlin程序查找Sphere的体积
  7. 行星齿轮设计_3D打印用于制造刚度平衡的行星架
  8. 编程语言python入门-2020年10月编程语言:Java、Python 龙争虎斗
  9. bootstrap popover弹框内容换行
  10. mysql数据库远程安装,Linux_15:解决远程安装数据库
  11. 启动startUML的时候报错“Exception EOleSysError in module StarUML.exe at 000AD559.
  12. 1. JDK版本变迁和各版本新特性
  13. D365 ERP流程笔记
  14. ie11安装程序无法继续 因为你的计算机,ie11无法安装解决方法详解
  15. 【树链剖分】月下毛景树
  16. vnc下:无法执行默认的终端模拟器
  17. 盗梦空间科普札记之一:梦里乾坤嵌套深,醒来可知在哪层?
  18. 企业邮箱登录入口首页是哪个,公共电子邮箱怎么申请注册?
  19. qt中socket编程
  20. 辅助驾驶事故频发,背后直指“决策安全模型”和驾驶员行为

热门文章

  1. JAVA实现汉字转换为拼音 pinyin4j/JPinyin
  2. Zookeeper面试题锦集
  3. 2020蓝桥杯省赛---java---B---10(整数小拼接)
  4. 81. 搜索旋转排序数组 II---Leecode----java
  5. browserquest php安装,请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker...
  6. 用python绘制图形_使用Python的turtle画炫酷图形
  7. jvm内存分配与收回策略
  8. 数据库死锁_死锁荔枝_解决方法
  9. jvm(2)-JVM内存的设置(解决eclipse下out of memory问题)
  10. java流与文件——读写二进制数据(DataOutput + DataInput)