JAVA使用SSE长连接进行即时通讯,给我写个详细示例,,基于RuoYi-Vue,基于SpringBoot 前后端分离版
时间: 2025-02-17 13:24:43 浏览: 131
在Java中,尤其是结合RuoYi-Vue前端框架和SpringBoot后端框架进行实时通讯,我们可以使用Server-Sent Events (SSE) 进行长连接。以下是基于这两个技术栈的一个简单示例:
**1. 后端 SpringBoot 部分(创建ServerSentEventController)**
首先,在SpringBoot项目里创建一个`ServerSentEventController`,负责处理 SSE 的发送和接收。
```java
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import java.io.IOException;
import java.util.Map;
@Controller
public class ServerSentEventController {
@Autowired
private WebSocketHandler webSocketHandler;
@GetMapping("/sse/{roomId}")
public String sse(@PathVariable("roomId") Long roomId, HttpSession session) {
// 注册WebSocket会话到HTTP会话
HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor();
Map<String, Object> attributes = session.getAttributeMap();
attributes.put("roomId", roomId);
return "forward:/websocket/" + roomId + "/" + session.getId();
}
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
webSocketHandler.handle(session);
}
// 发送事件
@OnMessage
public void sendMessage(String message, Session session) throws IOException {
session.getAsyncRemote().sendText(message);
}
}
```
**2. RuoYi-Vue前端部分(处理Websocket连接和消息接收)**
在RuoYi-Vue项目的前端,需要设置一个WebSocket连接,并监听接收到的消息。
```javascript
// App.vue 或者其他合适的地方
export default {
mounted() {
this.connectSSE();
},
methods: {
connectSSE() {
const socketURL = 'ws://' + window.location.host + '/sse/your-room-id'; // 替换为实际的房间ID
this.sseConnection = new EventSource(socketURL);
this.sseConnection.addEventListener('message', (event) => {
this.receiveMessage(JSON.parse(event.data)); // 解析并处理接收到的消息
});
},
receiveMessage(data) {
console.log('Received message:', data); // 这里可以做你想做的业务处理,比如更新界面等
},
// 关闭连接
disconnectSSE() {
if (this.sseConnection && !this.sseConnection.closed) {
this.sseConnection.close();
}
}
}
}
// 当需要断开连接时,如用户离开房间
beforeDestroy() {
this.disconnectSSE();
}
```
**
阅读全文
相关推荐














