Я новичок в WebSockets и пытаюсь создать сервер Websocket на основе Spring, а также клиент Java для общения с ним. Я сталкиваюсь с проблемами с фактическим соединением, как бы то ни было. Я предполагаю, что это как-то связано с моим WebSocketConfig.java
, хотя я не знаю достаточно о том, как работает Websockets, чтобы правильно его подключить ... Есть много руководств в Интернете, которые показывают пример кода, но не много объяснений о том, что на самом деле происходит, и как все на самом деле работает.
Меня также смущают многие способы, которыми веб-сокеты могут казаться реализованными ... В конце концов, я хочу настроить это так, чтобы сервер мог общаться с отдельными клиентами. Я на правильном пути?
Ошибка при подключении:
Caused by: org.glassfish.tyrus.core.HandshakeException: Response code was not 101: 404.
Код клиента:
public static void main(String[] args) throws InterruptedException {
LOGGER.info("Running Main.");
WebSocketClient client = new StandardWebSocketClient(); //provided by Tyrus
WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
StompSessionHandler sessionHandler = new MyStompSessionHandler();
stompClient.connect("ws://localhost:8080/websocket-api/chat/foo", sessionHandler);
Thread.sleep(10_000);
}
Код сервера: (в основном на примере учебного пособия по WebSocket от Spring)
ChatController.java
@Controller
public class ChatController {
@MessageMapping("/websocket-api/chat/{topic}")
@SendTo("/websocket-api/topic/messages")
public OutputMessage send(
@DestinationVariable("topic") String topic,
Message message
) throws Exception {
return new OutputMessage(message.getFrom(), message.getText(), topic);
}
}
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Value("/websocket-api") //to be put into configuration eventually
private String baseWebsocketApi;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker(baseWebsocketApi + "/topic");
config.setApplicationDestinationPrefixes(baseWebsocketApi + "/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint(baseWebsocketApi + "/chat").setAllowedOrigins("*").withSockJS();
}
}