Intellij: не удалось подключиться к удаленной виртуальной машине, не удалось подключиться к сеансу.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Intellij: не удалось подключиться к удаленной виртуальной машине, не удалось подключиться к сеансу.

Сообщение Anonymous »

Я использую Intellij и не могу подключиться к WebSocket Server. В консоли перешел на удаленную виртуальную машину и не удалось подключиться к сеансу. Как мне подключить сервер WebSocket?
ошибки:
2024-11-27T01:53:13.664+09:00 DEBUG 9340 --- [cTaskExecutor-1] o.s.m.simp.stomp.DefaultStompSession : Failed to connect session id=61818f8d-d731-ac9f-3034-d028855e44ed

java.util.concurrent.CompletionException: jakarta.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection to [ws://localhost:8080/portfolio] failed
Caused by: jakarta.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection to [ws://localhost:8080/portfolio] failed
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:429) ~[tomcat-embed-websocket-10.1.31.jar:10.1.31]
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:179) ~[tomcat-embed-websocket-10.1.31.jar:10.1.31]

и application.yml:
websocket:
server:
url: ws://localhost:8080/portfolio

Мои коды
Конфигурации
package study.withkbo.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import study.withkbo.game.web.CustomInterceptor;

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {

private final CustomInterceptor customInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor)
.addPathPatterns("/api/gameInfo/{month}");
}

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:5173")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true);
}
}

package study.withkbo.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import study.withkbo.server.service.ChatWebSocketHandler;

@Configuration
@EnableWebSocket
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketConfigurer {
private final ChatWebSocketHandler chatWebSocketHandler;

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatWebSocketHandler, "/portfolio");
System.out.println("Registered WebSocket Handler, WebSocketConfig");
}
}

package study.withkbo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.web.socket.config.annotation.*;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/portfolio")
.withSockJS();
}

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

}

Код ClientService для подключения к серверу
package study.withkbo.client.service;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.converter.StringMessageConverter;
import org.springframework.messaging.simp.stomp.StompSessionHandler;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.client.WebSocketClient;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.messaging.WebSocketStompClient;
import study.withkbo.client.handler.MyStompSessionHandler;
import study.withkbo.server.service.ChatWebSocketHandler;

@Service
public class ClientService {
private WebSocketStompClient stompClient;
@Value("${websocket.server.url}")
private String serverUrl;
private final ChatWebSocketHandler chatWebSocketHandler;

public ClientService(ChatWebSocketHandler chatWebSocketHandler) {
this.chatWebSocketHandler = chatWebSocketHandler;
}

@PostConstruct
public void init() {
System.out.println("serverUrl: " + serverUrl);
WebSocketClient webSocketClient = new StandardWebSocketClient();
stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setMessageConverter(new StringMessageConverter());

connect();
}
public void connect() {
System.out.println("Attempting to connect to WebSocket server at: " + serverUrl);
StompSessionHandler sessionHandler = new MyStompSessionHandler(chatWebSocketHandler);
stompClient.connect(serverUrl, sessionHandler);
}
}

И обработчики, которые потерпели неудачу:
package study.withkbo.client.handler;

import org.springframework.messaging.simp.stomp.*;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import study.withkbo.server.service.ChatWebSocketHandler;

import java.io.IOException;
import java.lang.reflect.Type;
public class MyStompSessionHandler extends StompSessionHandlerAdapter {
private final ChatWebSocketHandler chatWebSocketHandler;

public MyStompSessionHandler(ChatWebSocketHandler chatWebSocketHandler) {
this.chatWebSocketHandler = chatWebSocketHandler;
}

@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
System.out.println("STOMP session connected: " + session.getSessionId());
WebSocketSession webSocketSession = chatWebSocketHandler.getSession(session.getSessionId());
if (webSocketSession != null) {
System.out.println("WebSocketSession URI: " + webSocketSession.getUri());
try {
webSocketSession.sendMessage(new TextMessage("STOMP connect to WebSocket"));
} catch (IOException e) {
e.printStackTrace();
}
}

session.send("/app/recruit/{roomName}", "Hello, Server!");
session.subscribe("/topic/{roomName}", new StompFrameHandler() {
@Override
public Type getPayloadType(StompHeaders headers) {
return String.class;
}

@Override
public void handleFrame(StompHeaders headers, Object payload) {
System.out.println("get message : " + payload);
}
});
}

@Override
public void handleTransportError(StompSession session, Throwable exception) {
System.err.println("Transport Error: " + exception.getMessage());
}

@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
System.err.println("STOMP connection failed: " + exception.getMessage());
}
}

package study.withkbo.server.service;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {
private static final ConcurrentHashMap sessions = new ConcurrentHashMap();

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
// Log when the WebSocket connection is established
System.out.println("WebSocket connected: " + session.getId() + " | URI: " + session.getUri());
sessions.put(session.getId(), session);
}

protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("handleTextMessage: " + session.getId() + sessions);
System.out.println("handleTextMessage: " + message.getPayload());

sessions.forEach((key, value) -> {
System.out.println("key : "+ key + " value : " + value);
if(!key.equals(session.getId())){
try {
value.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session.getId());
System.out.println("afterConnectionClosed: " + session.getId() + "| CloseStatus : " + status);
}

public WebSocketSession getSession(String sessionId) {
return sessions.get(sessionId);
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... ct-session
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»