springboot与uni前端建立长链接实现的源码

时间: 2023-11-27 17:50:07 浏览: 34
建立长连接的实现方式一般有两种:WebSocket和SSE(Server-Sent Events)。下面分别介绍它们在Spring Boot框架下的实现方法。 ## WebSocket ### 1.创建WebSocket Endpoint 首先,我们需要创建一个WebSocket Endpoint,这个Endpoint将处理客户端与服务器之间的WebSocket通信。创建方法如下: ```java import org.springframework.stereotype.Component; import org.springframework.web.socket.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @Component public class WebSocketServer implements WebSocketHandler { //存储所有的socket连接 private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); //连接成功建立后,向所有客户端发送消息 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); System.out.println("连接成功建立!"); } //接收到客户端消息后,向所有客户端广播消息 @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { System.out.println("接收到客户端消息:" + message.getPayload()); broadcast(message.getPayload().toString()); } //连接关闭后,从列表中删除对应的socket连接 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { sessions.remove(session); System.out.println("连接已关闭:" + closeStatus.getReason()); } //广播消息给所有客户端 private void broadcast(String message) { TextMessage textMessage = new TextMessage(message); for (WebSocketSession session : sessions) { try { session.sendMessage(textMessage); } catch (IOException e) { e.printStackTrace(); } } } } ``` ### 2.配置WebSocket 在Spring Boot中,我们需要添加WebSocket的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 然后,在配置类中添加WebSocket配置: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(webSocketServer(), "/websocket").setAllowedOrigins("*"); } public WebSocketServer webSocketServer() { return new WebSocketServer(); } } ``` 这里我们将WebSocket Endpoint注册到了`/websocket`路径下,并且设置了跨域访问。 ### 3.前端页面实现 在前端页面中,使用`WebSocket`对象与服务器建立连接,并发送消息与接收消息。例如: ```javascript var websocket = new WebSocket("ws://localhost:8080/websocket"); websocket.onopen = function() { console.log("连接已建立!"); } websocket.onmessage = function(event) { console.log("接收到服务器消息:" + event.data); } websocket.onclose = function(event) { console.log("连接已关闭:" + event.reason); } function send() { var message = document.getElementById("message").value; websocket.send(message); } ``` ## SSE ### 1.创建Controller 首先,我们需要创建一个Controller,这个Controller将负责发送SSE(Server-Sent Events)数据流给客户端。创建方法如下: ```java import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @RestController public class SSEController { //每隔1秒向客户端发送一条消息 @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> sse() { return Flux.interval(Duration.ofSeconds(1)).map(i -> "当前时间:" + new Date()); } } ``` 这里使用了Reactor框架的`Flux`类,每隔1秒向客户端发送一条消息。 ### 2.前端页面实现 在前端页面中,使用`EventSource`对象与服务器建立连接,并接收服务器发送的SSE数据流。例如: ```javascript var eventSource = new EventSource("http://localhost:8080/sse"); eventSource.onmessage = function(event) { console.log("接收到服务器消息:" + event.data); } eventSource.onerror = function(event) { console.log("连接已断开!"); } ``` 注意,这里使用的是`EventSource`对象,而不是`WebSocket`对象。 ## 总结 无论是WebSocket还是SSE,都可以实现客户端与服务器之间的长连接。WebSocket适用于实时互动的场景,例如聊天室、直播间等;而SSE适用于需要定时向客户端发送数据的场景,例如股票行情、天气预报等。在Spring Boot框架下,实现WebSocket和SSE都非常简单,只需要写几行代码即可。

相关推荐

最新推荐

recommend-type

基于Spring Boot的校园食堂订餐系统的设计与实现.doc

采用基本的B/S的互联网架构,前台技术使用可跨Android、IOS、H5、小程序的uni-app进行开发,使用IDEA的IntelliJ IDEA 2019.3.1 x64和WebStorm 2020.1 x64开发工具实现后台与前台的编码。使用MySQL数据库存储技术进行...
recommend-type

uni-app:从运行原理上面解决性能优化问题

Uni-App,从了解到开发,相信大家都会觉得Uni-App性能不好,其实也这是非原生的弊病。React Native、Flutter等,非原生框架,性能上都会或多或少的折损。但各个框架,都会做出性能提升建议,所以开发者在开发前,多...
recommend-type

Java调用腾讯云短信API接口的实现

主要介绍了Java调用腾讯云短信API接口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

uni-app项目本地离线android打包步骤

uni-app项目本地离线android打包步骤 uni-app很好,但按照官方的android离线打包指导并不容易很顺利完成离线打包 结合官方文档,经过反复试验、百度总算打包成功 为此特整理成word,按自己认为合适的方式把打包步骤...
recommend-type

uniapp与webview之间的相互传值的实现

主要介绍了uniapp与webview之间的相互传值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。