以下是关于Spring WebSocket的完整攻略。
Spring WebSocket基本原理
Spring WebSocket是Spring框架提供的一个用于实现WebSocket协议的工具。WebSocket协议是一种基于TCP的协议,它允许在客户端和服务器之间进行双向通信。Spring WebSocket的步骤如下:
- 配置WebSocket
- 编写WebSocket处理器
- 编写WebSocket客户端
下面将详细说明每步。
步骤1:配置WebSocket
在使用Spring WebSocket之前,需要先配置WebSocket。可以使用以下示例配置WebSocket:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/myHandler").setAllowedOrigins("*");
}
@Bean
public WebSocketHandler myHandler() {
return new MyHandler();
}
}
在上面的示例中,我们使用@EnableWebSocket注解启用WebSocket,并使用registerWebSocketHandlers()方法注册WebSocket处理器。
步骤2:编写WebSocket处理
在配置了WebSocket之后,就可以编写WebSocket处理器了。可以使用以下示例Java代码编写WebSocket处理器:
public class MyHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
String payload = message.getPayload();
session.sendMessage(new TextMessage("Received: " + payload));
}
}
在上面的示例中,我们创建了一个MyHandler类,并继承了TextWebSocketHandler类。在handleTextMessage()方法中,我们处理了WebSocket消息,并将响应发送回客户端。
步骤3:编写WebSocket客户端
在编写了WebSocket处理器之后,就可以编写WebSocket客户端了。可以使用以下示例Java代码编写WebSocket客户端:
public class MyClient {
public static void main(String[] args) throws Exception {
WebSocketClient client = new StandardWebSocketClient();
WebSocketSession session = client.doHandshake(new MyHandler(), "ws://localhost:8080/myHandler").get();
session.sendMessage(new TextMessage("Hello, world!"));
session.close();
}
}
在上面的示例中,我们创建了一个MyClient类,并使用StandardWebSocketClient类创建了一个WebSocket客户端。在doHandshake()方法中,我们指定了WebSocket处理器和WebSocket服务器的URL。在sendMessage()方法中,我们发送了一条WebSocket消息,并在最后关闭了WebSocket会话。
示例
下面是两个使用Spring WebSocket的示例:
示例1:使用Spring WebSocket实现简单的聊天室
这个示例中,我们将使用Spring WebSocket实现一个简单的聊天室。
WebSocketConfig.java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatHandler(), "/chat").setAllowedOrigins("*");
}
@Bean
public WebSocketHandler chatHandler() {
return new ChatHandler();
}
}
在上面的示例中,我们使用@EnableWebSocket注解启用WebSocket,并使用registerWebSocketHandlers()方法注册WebSocket处理器。
ChatHandler.java
public class ChatHandler extends TextWebSocketHandler {
private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
for (WebSocketSession s : sessions) {
s.sendMessage(new TextMessage(session.getId() + ": " + message.getPayload()));
}
}
}
在上面的示例中,我们创建了一个ChatHandler类,并继承了TextWebSocketHandler类。在afterConnectionEstablished()方法中,我们将WebSocket会话添加到sessions列表中。在afterConnectionClosed()方法中,我们将WebSocket会话从sessions列表中删除。在handleTextMessage()方法中,我们处理了WebSocket消息,并将响应发送给所有WebSocket会话#### chat.html
<!DOCTYPE html>
<html>
<head>
<title>Chat Room</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(function() {
var socket = new WebSocket("ws://localhost:8080/chat");
socket.onmessage = function(event) {
$("#messages").append("<p>" + event.data + "</p>");
};
$("#send").click(function() {
var message = $("#message").val();
socket.send(message);
$("#message").val("");
});
});
</script>
</head>
<body>
<div id="messages"></div>
<input type="text" id="message">
<button id="send">Send</button>
</body>
</html>
在上面的示例中,我们创建了一个chat.html页面,并使用WebSocket连接到WebSocket服务器。在onmessage()方法中,我们将接收到的WebSocket消息添加到页面中。在click()方法中,我们发送了一条WebSocket消息。
示例2:使用Spring WebSocket实现实时数据更新
在这个示例中,我们将使用Spring WebSocket实现实时数据更新。
WebSocketConfig.java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(dataHandler(), "/data").setAllowedOrigins("*");
}
@Bean
public WebSocketHandler dataHandler() {
return new DataHandler();
}
}
在上面的示例中,我们使用@EnableWebSocket注解启用WebSocket,并使用registerWebSocketHandlers()方法注册WebSocket处理器。
DataHandler.java
public class DataHandler extends TextWebSocketHandler {
private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
private static final AtomicInteger counter = new AtomicInteger(0);
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
executor.scheduleAtFixedRate(() -> {
int value = counter.incrementAndGet();
for (WebSocketSession s : sessions) {
try {
s.sendMessage(new TextMessage(String.valueOf(value)));
} catch (IOException e) {
e.printStackTrace();
}
}
}, 0, 1, TimeUnit.SECONDS);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
}
在上面的示例中,我们创建了一个DataHandler类,并继承了TextWebSocketHandler类。在afterConnectionEstablished()方法中,我们将WebSocket会话添加到sessions列表中,并使用ScheduledExecutorService定期向所有WebSocket会话发送数据。在afterConnectionClosed()方法中,我们将WebSocket会话从sessions列表中删除。
data.html
<!DOCTYPE html>
<html>
<head>
<title>Data</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(function() {
var socket = new WebSocket("ws://localhost:8080/data");
socket.onmessage = function(event) {
$("#value").text(event.data);
};
});
</script>
</head>
<body>
<div id="value"></div>
</body>
</html>
在上面的示例中,我们创建了一个data.html页面,并使用WebSocket连接到WebSocket服务器。在onmessage()方法中,我们将接收到的WebSocket消息更新到页面中。