实时通信:使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CUDA10.1配置VS2017

目录 一 CUDA 安装 二 CUDA环境变量配置 三 CUDA配置VS2017 一 CUDA 安装 1.1 CUDA下载 网址:https://developer.nvidia.com/cuda-toolkit-archive 可以根据需要下载不同版本的CUDA安装包。 1.2 CUDA安装 1.2.1 双击下载的.exe文件安装 1.2.2 点击‘OK’ 1.2…

鸿蒙应用开发 常用组件与布局

简介 HarmonyOS ArkUI 提供了丰富多样的 UI 组件,您可以使用这些组件轻松地编写出更加丰富、漂亮的界面。在本篇 Codelab 中,您将通过一个简单的购物社交应用示例,学习如何使用常用的基础组件和容器组件。本示例主要包含:“登录”…

[数论]莫比乌斯反演1

索引 莫比乌斯反演1 定理莫比乌斯反演2 证明莫比乌斯反演3 技巧前言 本篇内容全部为定理,无证明 定义 莫比乌斯函数的符号为\(\mu\),通俗的来讲\[ \mu(n) \left\{ \begin{matrix} 1 & n1\\ (-1)^k & n p_1p_2p_3\dots p_k\\ 0 & \text{其他…

怎么卸载光速头条_我用这三招,整理了桌面并且屏蔽了广告弹窗

这段时间,在用公司电脑工作时,有两个问题让我非常不爽。一是正处在专心工作中,突然桌面中间就弹出一个:天猫双12的广告,而且还没有关闭按钮。只能打开然后再关闭。二是每次打开电脑,桌面中间和右下角就有一…

Qt配置VS2017

目录 一 Qt安装 二 VS2017安装 三 Qt配置VS2017 一 Qt安装 1.1 下载网址:http://download.qt.io/archive/qt/ 这里选择 1.2 安装Qt 安装路径可以自己更改,然后点下一步 可以根据自己的VS版本自己选择,我们这里选MSVC-2017 64-bit 二…

opencv python tutorials_OpenCV-Python Tutorials 笔记(二)

OpenCV官方有一个面向python的文档OpenCV-PythonTutorials:我根据此文档进行了实践学习,结合自己经验简单记录一下笔记。(续)4、Image Processing inOpenCV4.1ChangingColorspaces转换颜色空间算是极其常用的操作了。不用说,cvtColor()。相关…

runltp出现问题 [

runltp 623行: if [ "$?" "0" ]; then 对[解析出了问题。 我灵机一动,是不是sh的问题。 which sh /bin/sh ls -l /bin/sh sh指向dash 果然不对 rm后 ln -s /bin/bash /bin/sh 再次运行,正确。 转载于:https://www.cnbl…

fork join框架_Java 7:Fork / Join框架示例

fork join框架Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计,并将这些任务的结果组合起来以产生最终结果。 通常,使用Fork / Join Framework的类遵循以下简单算法: // pseudocode Result solve(Problem problem) {if (p…

numpy T、transpose()函数、swapaxes()函数

目录 1 矩阵转置T,既线性代数中矩阵转置 2 transpose()函数 3 swapaxes()函数 1 矩阵转置T,既线性代数中矩阵转置 示例程序如下: import numpy as npa np.arange(0,24,2).reshape(3, 4)print(*****a****) print(a: \n, a) print(a.…

leetcode-54 螺旋矩阵

题目: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,…

米线店结账程序 装饰着模式_实验报告2_装饰者模式

序号:姓名:杨林燕学号:106专业:软件工程日期:成绩:实验二装饰者模式的运用一、实验目的:装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的…

Java的内置垃圾收集如何使您的生活更美好(大部分时间)

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览! “无需为用户编写将寄存器返回到自由存储列表的程序。” 该行(以及随后的十几行)被埋在约翰麦卡锡(John McCart…

PyOpenCV 坐标系统

pyOpenCV中的坐标系统,以图片左上角为原点(0,0),水平方向为x轴(也既图像的宽度width),竖直方向为y轴(也既图像的高度height),如下图所示: #图像中…

office 论文 页码_毕业论文必备技巧:Word页码从第三页开始设置方法

许多应届毕业生在排版毕业论文时候,都会按要求设置页码,第一页是封面,第二页是目录,那么正文内容就要从第三页正式开始了。按照正规设置方式,那么页码此时应该是第三页。但是按照论文格式规定,页码应该是从…

散列

一.什么是散列 散列使用一个散列函数,将一个键映射到一个索引上。散列非常高效。使用散列将耗费O(1)时间来查找、插入、及删除一个元素。 映射表是一种用散列实现的数据结构,映射表是一种存储条目的容器,每个条目包含两个部分:一个…

移动端触摸(touch)事件

目有个交互需要实现手指滑动的交互,pc端使用mousedown,mousemove,mouseup监听实现。 但在ios设备上mousemove是不好监听的,同类的方法是touchstart,touchmove,touchend。 项目需求,需要用到拖动事件。由于不需要考虑IE8等低端浏览器的兼容性&…

numcpp速度对比_PHP和C++性能对比.pdf

PHP 与C性能比较本文博客链接:http://keping.me/php_vs_cpp/PHP 是速度很快的脚本语言,但是用了框架以后好像感觉挺慢的。于是猜测会不会PHP 本身也不是很快。如果不是很快,能否采用 PHP 调用本地动态链接库的形式来提升速度。于是有了下面的…

jndi ldap_什么是JNDI,SPI,CCI,LDAP和JCA?

jndi ldapJNDI代表Java命名和目录接口 。 它是用于提供对目录服务(即,服务映射名称(字符串)与对象,对远程对象或简单数据的引用)访问的API。 这就是所谓的 约束力 。 绑定集称为上下文 。 应用程序使用JND…

PyOpenCV 基本操作

目录 1. 图片加载、显示和保存 2. 图像显示窗口创建与销毁 3. 图片宽、高、通道数获取 4. 图像像素数目和图像数据类型的获取 5. 生成指定大小的空图像, 生成指定大小的空图像 6. 访问和操作图像像素 7. 图像三通道分离和合并 8. 抓取摄像头 1. 图片加载、显示和保存 …

python中用于标识字符串的定界符_Python 基本数据类型

######################基本数据类型######################数字类型整数 int整数是用来表示整数数值,即没有小数部分的数值,包括正整数 负整数和0整数类型包括十进制整数 八进制整数 十六进制整数和二进制整数例如: 0 , 100 , 65205浮点数 float浮点数由整数部分和小数部分组成…