Spring WebSocket

  • Post category:Java

以下是关于Spring WebSocket的完整攻略。

Spring WebSocket基本原理

Spring WebSocket是Spring框架提供的一个用于实现WebSocket协议的工具。WebSocket协议是一种基于TCP的协议,它允许在客户端和服务器之间进行双向通信。Spring WebSocket的步骤如下:

  1. 配置WebSocket
  2. 编写WebSocket处理器
  3. 编写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消息更新到页面中。