2016-12-15 4 views
2

인터넷을 통해 검색하는 동안 지금까지 배운 내용에서 openshift는 HTTP를 통해 웹 소켓 연결을 여는 데 포트 8000 만 제공합니다.WebSocket 핸드 셰이크 중 오류 : 예기치 않은 응답 코드 : Spring Websocket, Stomp, OpenSock에서 SockJS 사용시

Stomp와 SockJs를 사용하여 스프링 WebSocket을 구현하는 방법은 무엇인지 알 수 없습니다.

function connect() { 
     var socket = new SockJS('http://jbossews-nabac.rhcloud.com:8000/portal/ws'); 
     stompClient = Stomp.over(socket); 
     stompClient.connect({}, function(frame) { 
      setConnected(true); 
      console.log('Connected: ' + frame); 
      stompClient.subscribe('/queue/reply/${pageContext.session.id}', function(greeting) { 
       showGreeting(greeting.body); 
      }); 
     }); 
    } 

웹 소켓 서버 측 Configration : 여기 내 코드,

웹 소켓 클라이언트 측 구현이다

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketDefaultConfig extends AbstractWebSocketMessageBrokerConfigurer { 

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

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/ws") 
     .withSockJS() 
     .setInterceptors(httpSessionIdHandshakeInterceptor()); 
    } 

    @Bean 
    public HttpSessionIdHandshakeInterceptor httpSessionIdHandshakeInterceptor() { 
     return new HttpSessionIdHandshakeInterceptor(); 
    } 

} 

Chrome Console

은 내가이 방법을 시도하는 경우,

var socket = new SockJS('/portal/ws'); 
나는이 얻을

오류,

Chrome Console

이 오류를 해결하기 위해 도와주세요.

+0

이 문제를 해결 했습니까? 그렇다면 답을 공유해주십시오. – Debopam

답변

0

필자도 동일한 문제가 있었고, 오랜 시간이 지나자 Openshift V3에서 Spring WebSocket을 사용할 수 있었지만이 솔루션은 이전의 Openshift V2에서도 작동한다고 생각합니다.

유일한 단점은 SockJS가 아니라 표준 WebSocket API를 사용하는 것입니다.

귀하의 경우 registerStompEndpoints에서 .withSockJS()를 제거하고 접미어 "/ websocket"을 추가하고 끝점을 "*"로 설정해야합니다 (아마 후자는 필수가 아님).

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketDefaultConfig extends AbstractWebSocketMessageBrokerConfigurer { 

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

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/ws/websocket") 
     .setAllowedOrigins(‌​"*") 
     .setInterceptors(httpSessionIdHandshakeInterceptor()); 
    } 

    @Bean 
    public HttpSessionIdHandshakeInterceptor httpSessionIdHandshakeInterceptor() { 
     return new HttpSessionIdHandshakeInterceptor(); 
    } 
} 

클라이언트에서 SockJS 대신 WebSocket API를 사용해야하고 새 경로를 사용하여 끝점에 연결해야합니다.

function connect() { 
    var socket = new WebSocket('ws://your_service_exposed_route:80/portal/ws/websocket'); 
    stompClient = Stomp.over(socket); 
    stompClient.connect({}, function(frame) { 
     setConnected(true); 
     console.log('Connected: ' + frame); 
     stompClient.subscribe('/queue/reply/${pageContext.session.id}', function(greeting) { 
      showGreeting(greeting.body); 
     }); 
    }); 
} 

나는 포트 80을 사용했다. OpenShift V3은 동일한 포트에서 웹 소켓을 실행하는 것을 지원한다. 서비스가 경로를 통해 노출되면 웹 소켓을 포함하여 HTTP 트래픽에 대해 외부에서 포트 80이됩니다.

그게 전부입니다!