基于Java的websocket客户端,用于基于Spring的websocket服务器

时间:2017-06-24 11:01:24

标签: java spring-boot websocket spring-websocket java-websocket

我使用Spring Boot开发了这个websocket服务器。服务器与基于js的客户端一起工作正常。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(final MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(final StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").withSockJS();
        registry.addEndpoint("/chat");
    }

}

控制器:

@Controller
public class ChatController {

    @MessageMapping("/chat")
    @SendTo("/topic/messages")
    public OutputMessage send(final Message message) throws Exception {

        final String time = new SimpleDateFormat("HH:mm").format(new Date());
        return new OutputMessage(message.getFrom(), message.getText(), time);
    }

}

这是服务器端。现在,对于客户端,我创建了一个@ClientEndpoint,当我连接到URI" ws:// localhost:8080 / spring-mvc-java / chat"时,我能够建立一个连接,我可以看到@ClientEndpoint的@OnOpen回调被触发了。

但是,似乎userSession.getAsyncRemote()。sendText(消息)没有任何效果。我没有看到服务器的响应。

我可以看到js客户端是:

  1. 连接服务器var socket = new SockJS(' / spring-mvc-java / chat')
  2. 订阅stompClient.subscribe(' / topic / messages',...
  3. 发送消息stompClient.send(" / app / chat",...
  4. 我能够迈出第一步。如何在基于Java的客户端中实现第2步和第3步?

    由于

1 个答案:

答案 0 :(得分:0)

首先你需要一个 websocketclient 和 websocketstompclient

WebSocketClient client = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());

您必须为 StompSessionHandler 自定义处理程序

getPayloadType
handleFrame
afterConnected
handleException
handleTransportError

方法

StompSessionHandler sessionHandler = new CustomStompSessionHandler();

你可以像这样连接你的套接字。您可以完成发送和接收消息

StompSession stompSession=stompClient.connect("ws://localhost:8080/chat",sessionHandler).get();

这两个触发你的 websocket topic/messages 通过套接字给你消息

/app/chat 发送 Message 到套接字

stompSession.subscribe("/topic/messages", sessionHandler);
stompSession.send("/app/chat", new Message("Hi", "user"));

你想要这样吗?