springboot 写一个WebSocket服务端,要求可以和很多客户端保持长连接
时间: 2023-07-16 20:16:02 浏览: 178
websocket实现服务端与客户端通信
好的,下面是一个简单的Spring Boot WebSocket服务端示例:
1. 首先,在 pom.xml 中添加以下依赖:
```xml
<dependencies>
<!-- Spring Boot WebSocket依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Spring Boot Web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
```
2. 创建一个 WebSocketHandler 类来处理 WebSocket 连接:
```java
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Component
public class MyWebSocketHandler implements WebSocketHandler {
private static List<WebSocketSession> sessions = new ArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
public void handleMessage(WebSocketSession session, TextMessage message) throws Exception {
for (WebSocketSession s : sessions) {
s.sendMessage(message);
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if (session.isOpen()) {
session.close();
}
sessions.remove(session);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
```
这个类实现了 WebSocketHandler 接口,并重写了其中的几个方法来处理 WebSocket 连接操作。其中,afterConnectionEstablished 方法在建立连接时被调用,handleMessage 方法在接收到消息时被调用,afterConnectionClosed 方法在连接关闭时被调用,handleTransportError 方法在连接出现异常时被调用。
3. 创建一个 WebSocketConfig 类来配置 WebSocket:
```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Bean
public MyWebSocketHandler myWebSocketHandler() {
return new MyWebSocketHandler();
}
}
```
这个类使用 @Configuration 注解表示它是一个配置类,同时使用 @Bean 注解将 MyWebSocketHandler 类和 ServerEndpointExporter 类注入到 Spring 容器中。
4. 在控制器中使用 WebSocket:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.socket.WebSocketSession;
@Controller
public class MyController {
@Autowired
private MyWebSocketHandler myWebSocketHandler;
@GetMapping("/")
public String index() {
return "index.html";
}
@GetMapping("/send")
@ResponseBody
public String sendMessage(String message) throws IOException {
TextMessage textMessage = new TextMessage(message.getBytes());
for (WebSocketSession session : MyWebSocketHandler.sessions) {
session.sendMessage(textMessage);
}
return "success";
}
}
```
这个控制器包含两个方法,index 方法返回一个 HTML 页面,sendMesssage 方法可以向所有客户端发送消息。
5. 编写一个 index.html 页面来测试 WebSocket:
```html
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Test</title>
<meta charset="UTF-8">
<script type="text/javascript">
var socket = new WebSocket("ws://" + location.host + "/websocket");
socket.onopen = function () {
console.log("WebSocket连接成功");
};
socket.onmessage = function (event) {
console.log("收到消息:" + event.data);
};
socket.onclose = function () {
console.log("WebSocket连接关闭");
};
function sendMessage() {
var inputMessage = document.getElementById("inputMessage").value;
socket.send(inputMessage);
console.log("发送消息:" + inputMessage);
}
</script>
</head>
<body>
<input type="text" id="inputMessage">
<button onclick="sendMessage()">发送</button>
</body>
</html>
```
这个页面中使用 WebSocket API 来连接 WebSocket 服务端并发送消息。
6. 启动 Spring Boot 应用程序,访问 http://localhost:8080/ 可以看到 index.html 页面。在多个浏览器标签页中打开该页面,并在其中一个标签页中发送消息,其他标签页都可以收到消息。
以上就是一个简单的 Spring Boot WebSocket 服务端示例。
阅读全文