【问题标题】:Java based websocket client for Spring based websocket server基于 Java 的 websocket 客户端,用于基于 Spring 的 websocket 服务器
【发布时间】:2017-11-27 21:00:01
【问题描述】:

我有这个使用 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(message) 似乎没有任何效果。我没有看到来自服务器的响应。

我可以看到js客户端是:

  1. 连接到服务器 var socket = new SockJS('/spring-mvc-java/chat')
  2. 订阅 stompClient.subscribe('/topic/messages',...
  3. 发送消息 stompClient.send("/app/chat",...

我能够迈出第一步。如何在基于 Java 的客户端中实现第 2 步和第 3 步?

谢谢

【问题讨论】:

  • 当您说基于 java 的客户端时,您使用的是任何 web socket 库和 stomp 库吗?
  • 没有。没有跺脚,没有 sockjs。我实际上正在尝试关注这件事programmingforliving.com/2013/08/…

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


【解决方案1】:

首先你需要一个 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/chatMessage 发送到套接字

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

你想要这样吗?

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 2015-10-26
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多