Java WebSocketStompClient连接不返回

时间:2018-03-15 03:32:18

标签: java spring stomp spring-websocket

我尝试使用Spring和websockets设置一个简单的应用程序,并且在设置连接时遇到问题。 我查看了一些示例,但几乎所有搜索都会导致聊天示例,这不是我想要做的。 我的应用程序是一个任务/监控场景。我希望能够向服务器发送请求,然后监视进度 同一个连接上的任务。

我已经看过聊天样本,投资组合样本和其他各种评论,但我不确定我错过了什么。 我是Spring和websockets的新手。

日志记录似乎显示/ info路径的成功连接,但是对stompClient.connect()的调用无法返回。

14:02:26.330 [main] DEBUG org.springframework.web.socket.sockjs.client.RestTemplateXhrTransport - Executing SockJS Info request, url=http://localhost:9080/Vault713MQServer/websocket/info
14:02:26.480 [main] DEBUG org.springframework.web.client.RestTemplate - Created GET request for "http://localhost:9080/Vault713MQServer/websocket/info"
14:02:26.559 [main] DEBUG org.springframework.web.client.RestTemplate - GET request for "http://localhost:9080/Vault713MQServer/websocket/info" resulted in 200 (OK)
14:02:26.578 [main] DEBUG org.springframework.web.socket.sockjs.client.WebSocketTransport - Starting WebSocket session url=ws://localhost:9080/Vault713MQServer/websocket/369/ee89fc87489842af868c0f0452aacf13/websocket
14:02:26.578 [main] DEBUG org.springframework.web.socket.client.standard.StandardWebSocketClient - Connecting to ws://localhost:9080/Vault713MQServer/websocket/369/ee89fc87489842af868c0f0452aacf13/websocket
14:02:26.693 [WebSocketClient-AsyncIO-1] DEBUG org.springframework.web.socket.sockjs.client.WebSocketClientSockJsSession - Processing SockJS open frame in WebSocketClientSockJsSession[id='ee89fc87489842af868c0f0452aacf13, url=ws://localhost:9080/Vault713MQServer/websocket]
14:02:26.693 [WebSocketClient-AsyncIO-1] DEBUG org.springframework.messaging.simp.stomp.DefaultStompSession - Connection established in session id=07e2d0cc-6f99-95d5-7014-614aad3e0f13

如果我连接到' http://localhost:9080/Vault713MQServer/websocket/info'在浏览器中返回:

{"entropy":1894449220,"origins":["*:*"],"cookie_needed":true,"websocket":true}

在服务器端,我有:

/* WebSocketConfig.java */

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer
{
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)
    {
        registry.addHandler(myHandler(), "/websocket").withSockJS();
    }

    @Bean
    public ServerHandler myHandler()
    {
        return new ServerHandler();
    }
}

/* ServerHandler.java */

public class ServerHandler extends TextWebSocketHandler
{

    private final Logger logger = Logger.getLogger(this.getClass().getName());

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // TODO Auto-generated method stub
        logger.log(Level.INFO, "Connection clodes with websocket server: session id {0}", session.getId());
        super.afterConnectionClosed(session, status);
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // TODO Auto-generated method stub
        logger.log(Level.INFO, "Connected user with websocket server: session id {0}", session.getId());
        super.afterConnectionEstablished(session);
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        // TODO Auto-generated method stub
        super.handleMessage(session, message);
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        // TODO Auto-generated method stub
        super.handleTransportError(session, exception);
    }
}

在客户端,我有:

/* Clientside - Vault713MQClient.java */

public class Vault713MQClient
{
    static public class MyStompSessionHandler
        extends StompSessionHandlerAdapter
    {
        private String userId;

        public MyStompSessionHandler(String userId)
        {
            this.userId = userId;
        }

        private void showHeaders(StompHeaders headers)
        {
            for (Map.Entry<String, List<String>> e : headers.entrySet())
            {
                System.err.print("  " + e.getKey() + ": ");
                boolean first = true;
                for (String v : e.getValue())
                {
                    if (!first)
                    {
                        System.err.print(", ");
                    }
                    System.err.print(v);
                    first = false;
                }
                System.err.println();
            }
        }

        private void sendJsonMessage(StompSession session)
        {
            session.send("/websocket", "hello from spring");
        }

        private void subscribeTopic(String topic, StompSession session)
        {
            session.subscribe(topic, new StompFrameHandler()
            {

                @Override
                public Type getPayloadType(StompHeaders headers)
                {
                    return String.class;
                }

                @Override
                public void handleFrame(StompHeaders headers,
                    Object payload)
                {
                    System.err.println(payload.toString());
                }
            });
        }

        @Override
        public void afterConnected(StompSession session,
            StompHeaders connectedHeaders)
        {
            System.err.println("Connected! Headers:");
            showHeaders(connectedHeaders);

//          subscribeTopic("/topic/messages", session);
//          sendJsonMessage(session);
        }
    }

    public static void main(String args[]) throws Exception
    {
        WebSocketClient simpleWebSocketClient = new StandardWebSocketClient();
        List<Transport> transports = new ArrayList<>(1);
        transports.add(new WebSocketTransport(simpleWebSocketClient));

        SockJsClient sockJsClient = new SockJsClient(transports);
        WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
        stompClient.setMessageConverter(new MappingJackson2MessageConverter());

        String url = "ws://localhost:9080/Vault713MQServer/websocket";
        String userId = "spring-" + ThreadLocalRandom.current().nextInt(1, 99);
        StompSessionHandler sessionHandler = new MyStompSessionHandler(userId);
        StompSession session = stompClient.connect(url, sessionHandler).get();
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (;;)
        {
            System.out.print(userId + " >> ");
            System.out.flush();
            String line = in.readLine();
            if (line == null)
            {
                break;
            }
            if (line.length() == 0)
            {
                continue;
            }
            session.send("/websocket", line);
//          ClientMessage msg = new ClientMessage(userId, line);
//          session.send("/app/chat/java", msg);
        }
    }
}

任何人都可以看到我做错了什么,或者有没有人有一个简单完整的例子来说明我想做什么?

非常感谢。 KCM

0 个答案:

没有答案