2016-11-11 14 views
0

私はSpring WebSocketsを使用することを学んでいますが、動作するための非常に基本的な例は得られません。 私は参考としてhttp://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.htmlを使用しました。非常に基本的なSpring websocketの返品404

WebSocketConfig:

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 
    private Logger logger = Logger.getLogger(WebSocketConfig.class); 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     logger.debug("Registering websocket handler"); 
     registry.addHandler(gameWebSocketHandler(), "/StreamGame/ws/play"); 
    } 

    @Bean 
    public WebSocketHandler gameWebSocketHandler() { 
     return new GameWebSocketHandler(); 
    } 
} 

WebSocketHandler:

public class GameWebSocketHandler extends TextWebSocketHandler { 
    final static Logger logger = Logger.getLogger(GameWebSocketHandler.class); 

    public GameWebSocketHandler() { 
     logger.debug("Constructor handler"); 
    } 

    @Override 
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { 
     super.handleTransportError(session, exception); 
     logger.error("Transport error: " + exception.getMessage()); 
    } 

    @Override 
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { 
     logger.info("Handle message received: " + message.getPayload()); 
     //session.sendMessage(new TextMessage("Here is your answer")); 
    } 

    @Override 
    public void afterConnectionEstablished(WebSocketSession session) throws Exception { 
     super.afterConnectionEstablished(session); 
     logger.info("Connection established!"); 
    } 
} 

私もこれで、間違えていなければ、私のように、クライアントからサーバへのWebSocketを介してメッセージを送信することができるはずです以下:

sock = new WebSocket('ws://localhost:8080/StreamGame/ws/play'); 

接続時に次のエラーが表示されます。

のWebSocketハンドシェーク中のエラー:予期しない応答コード:404WrappedWebSocket @ VM84:35(匿名関数)(指数)@:11J @のjqueryの-3.1.1.min.js:jqueryの-3.1.1.min @ 2K .js:2 (インデックス):26エラー未定義

のWeb.xmlには、以下が含まれています

<!-- Processes application requests --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/application-context.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>SpringMVCDispatcherServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/application-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- Mapping websocket to spring dispatcher servlet --> 
    <servlet-mapping> 
     <servlet-name>SpringMVCDispatcherServlet</servlet-name> 
     <url-pattern>/ws/*</url-pattern> 
    </servlet-mapping> 

マイSpringアプリケーションコンテキストが含まれています

をWebSocketを接続する場合

私は、サーバーログに以下を参照してください。

>  2016-11-13 TRACE - 39804 - org.springframework.web.servlet.DispatcherServlet - 
> http-nio-8080-exec-2 - Bound request context to thread: 
> [email protected] 
>  2016-11-13 DEBUG - 39804 - org.springframework.web.servlet.DispatcherServlet - 
> http-nio-8080-exec-2 - DispatcherServlet with name 
> 'SpringMVCDispatcherServlet' processing GET request for 
> [/StreamGame/ws/play] 
>  2016-11-13 TRACE - 39804 - org.springframework.web.servlet.DispatcherServlet - 
> http-nio-8080-exec-2 - Testing handler map 
> [org.sp[email protected]4e92ebf3] 
> in DispatcherServlet with name 'SpringMVCDispatcherServlet' 
>  2016-11-13 TRACE - 39804 - org.springframework.web.socket.server.support.WebSocketHandlerMapping 
> - http-nio-8080-exec-2 - No handler mapping found for [/play] 
>  2016-11-13 WARN - 39804 - org.springframework.web.servlet.PageNotFound - http-nio-8080-exec-2 - 
> No mapping found for HTTP request with URI [/StreamGame/ws/play] in 
> DispatcherServlet with name 'SpringMVCDispatcherServlet' 

答えて

0

のAddHandler機能はそれほどルートコンテキスト(StreamGame)およびディスパッチャマッピング(/ WS)を除く、 '/ PLAY' にマッピングされる必要があります。 addHandlerを変更しても問題が解決:

registry.addHandler(gameWebSocketHandler(), "/play"); 

次のようにそれを開いたときに接続のWebSocket:

sock = new WebSocket('ws://localhost:8080/StreamGame/ws/play'); 
1

は、あなたのWebSocketのURLが間違っているようです。あなたはハンドラとしてを再生/ を登録したのに/あなたがそうのように、メッセージを送信する前に終了する接続ハンドシェイクを待つ必要がありますので

はまた、WS接続が非同期に作成されていることを心に留めておくプレー/StreamGameを呼び出します。

var ws = new WebSocket("ws://localhost:8080/play"); 
ws.onopen = function() { 
    ws.send('AHOIHOI'); 
} 
ws.onerror = function(error) { 
    // handle connection error 
} 
+0

こんにちは、 はあなたのアドバイスをいただき、ありがとうございます。私は/ StreamGame/playにwebsocketの設定を変更しようとしましたが、同じ結果が返されます: registry.addHandler(gameWebSocketHandler()、 "/ StreamGame/play"); – Wesley

+1

さて、あなたのクラスがインスタンス化されていなければ、それは動作しません。アプリケーションをセットアップするためにSpring-Bootを使用しましたか?そうでなければ、コンポーネントスキャンクラスパスを正しく設定するのを忘れているかもしれません。 – Quagaar

+0

こんにちはQuagaar、 オリジナルの投稿にapplication-context.xmlとweb.xmlを追加しました。 web.xmlで何かを定義する必要はありますか? – Wesley

関連する問題