springboot与uni前端建立长链接实现的源码
时间: 2023-11-27 16:50:07 浏览: 158
建立长连接的实现方式一般有两种: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都非常简单,只需要写几行代码即可。
阅读全文