Клиент websocket на основе Java для сервера websocket на основе Spring

У меня есть этот сервер websocket, разработанный с использованием Spring Boot. Сервер отлично работает с клиентом на основе 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», я могу установить соединение и вижу, что Запускается обратный вызов @OnOpen для @ClientEndpoint.

Однако похоже, что userSession.getAsyncRemote (). SendText (message) не имеет никакого эффекта. Я не вижу ответа от сервера.

Я вижу, что клиент js:

  1. Подключение к серверу var socket = new SockJS ('/ spring-mvc-java / chat')
  2. Подписка на StompClient.subscribe ('/ topic / messages', ...
  3. Отправьте сообщениеrmpClient.send ("/ app / chat", ...

Я могу сделать первый шаг. Как достичь 2-го и 3-го шагов в клиенте на основе Java?

Спасибо


person Yasin    schedule 24.06.2017    source источник
comment
когда вы говорите «клиент на основе Java», используете ли вы какую-либо библиотеку веб-сокетов или библиотеку Stomp?   -  person Jos    schedule 24.06.2017
comment
Нет. Ни топота, ни носков. Я на самом деле пытаюсь следить за этой штукой programmingforliving.com/2013/08/   -  person Yasin    schedule 24.06.2017


Ответы (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();

Эти два триггера вашего веб-сокета topic/messages отправляют вам сообщения через сокеты.

/app/chat отправка Message в сокеты

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

ты хочешь этого?

person myratas    schedule 28.12.2020
comment
Хотя этот код может решить вопрос, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего пост, и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person Yunnosch; 28.12.2020