以下是一个简单的Spring Boot项目中使用WebSocket的示例代码:
1. **添加依赖**:在`pom.xml`文件中添加Spring Boot的WebSocket依赖。
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
```
2. **创建WebSocket配置类** (`WebSocketConfig.java`):
```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();
}
}
```
3. **创建WebSocket端点类** (`WebSocketServer.java`):
```java
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpointConfig;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArrayList;
@Component
@ServerEndpoint(value = "/websocket")
public class WebSocketServer {
private Session session;
private static CopyOnWriteArrayList<WebSocketServer> instances = new CopyOnWriteArrayList<>();
@OnOpen
public void onOpen(Session session) {
this.session = session;
instances.add(this);
System.out.println("客户端连接成功,连接ID:" + session.getId());
}
@OnMessage
public void onMessage(String message) {
System.out.println("收到客户端消息:" + message);
// 可以在这里处理消息,例如向所有客户端广播消息
for (WebSocketServer instance : instances) {
if (instance.session != null && instance.session.isOpen()) {
try {
instance.session.getBasicRemote().sendText("广播消息:" + message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@OnClose
public void onClose(Session session) {
instances.remove(this);
System.out.println("客户端断开连接,连接ID:" + session.getId());
}
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误:" + error.getMessage());
}
}
```
4. **编写控制器类** (`WebSocketController.java`):
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.socket.WebSocketSession;
@RestController
public class WebSocketController {
@Autowired
private WebSocketServer webSocketServer;
@GetMapping("/send")
public String sendMessage(WebSocketSession session, String message) {
if (session != null && session.isOpen()) {
try {
session.sendMessage(new TextMessage(message));
return "Message sent successfully";
} catch (IOException e) {
return "Failed to send message";
}
}
return "Session is not open";
}
}
```
5. **前端页面** (`index.html`):
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Test</title>
<script type="text/javascript">
var websocket = new WebSocket("ws://localhost:8080/websocket");
websocket.onopen = function(event) {
console.log("Connected");
};
websocket.onmessage = function(event) {
console.log("Received: " + event.data);
};
websocket.onerror = function(event) {
console.error("Error: " + event);
};
websocket.onclose = function(event) {
console.log("Disconnected");
};
function sendMessage() {
var message = document.getElementById("message").value;
websocket.send(message);
}
</script>
</head>
<body>
<input type="text" id="message" placeholder="Type a message to send">
<button οnclick="sendMessage()">Send</button>
</body>
</html>