首页 > 解决方案 > Spring WebSocketSession ID在服务器和客户端之间是不同的

问题描述

启动spring WebSocket Server

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketHandler() {
            @Override
            public void afterConnectionEstablished(WebSocketSession session) throws Exception {
                System.out.println("SERVER Established " + session.getId());
            }

            @Override
            public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
            }

            @Override
            public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
            }

            @Override
            public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
                System.out.println("SERVER Closed " + session.getId());
            }

            @Override
            public boolean supportsPartialMessages() {
                return false;
            }
        }, "/ws").setAllowedOrigins("*");
    }
}

然后连接到 WebSocket 服务器

    @Value("${server.port}")
    int port;

    @Test
    public void test() throws InterruptedException, IOException, ExecutionException {

        URI uri = UriComponentsBuilder
                .fromUriString("ws://127.0.0.1:" + port + "/ws").buildAndExpand().encode().toUri();

        WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
        WebSocketSession session = new StandardWebSocketClient()
                .doHandshake(new WebSocketHandler() {
                    @Override
                    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
                        System.out.println("CLIENT Established " + session.getId());
                    }

                    @Override
                    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {

                    }

                    @Override
                    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

                    }

                    @Override
                    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
                        System.out.println("CLIENT Closed " + session.getId());
                    }

                    @Override
                    public boolean supportsPartialMessages() {
                        return false;
                    }
                }, headers, uri)
                .get();

    }

控制台输出是

SERVER Established d1d1c7ba-eecc-1a42-ad1f-ff469a4ace94
CLIENT Established ca0d6a93-49eb-5022-630b-3a06afc25200

CLIENT Closed ca0d6a93-49eb-5022-630b-3a06afc25200
SERVER Closed d1d1c7ba-eecc-1a42-ad1f-ff469a4ace94

为什么ID不一样?

我想做的是,

所以我需要在 websocket 服务器和客户端上获得相同的 ID。

标签: websocketspring-websocket

解决方案


推荐阅读