2016-11-09 10 views
1

私は基本的なHTTPとWebSocketをVert.xサーバーをセットアップしようとしているの200を返しますが、WebSocketのルートは常に101Vert.xのWebSocketの代わりに101

public class PhilTheServer extends AbstractVerticle { 

    private final static int PORT = 8080; 

    @Override 
    public void start(Future<Void> fut) { 
     // Create a router object. 
     Router router = Router.router(vertx); 

     // We need cookies, sessions and request bodies 
     router.route().handler(CookieHandler.create()); 
     router.route().handler(BodyHandler.create()); 

     router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx))); 

     // Simple auth service which uses a properties file for user/role info 
     AuthProvider authProvider = ShiroAuth.create(vertx, new ShiroAuthOptions() 
       .setType(ShiroAuthRealmType.PROPERTIES) 
       .setConfig(new JsonObject() 
        .put("properties_path", "src/main/resources/vertx-users.properties"))); 

     // We need a user session handler too to make sure the user is stored in the session between requests 
     router.route().handler(UserSessionHandler.create(authProvider)); 

     // Serve the static private pages from directory "webroot" 
     router.route("/static/*").handler(StaticHandler.create("webroot/static").setCachingEnabled(false)); 

     // Public Index Page 
     router.get("/").handler(ctx -> { 
      ctx.response().sendFile("webroot/index.html"); 
     }); 

     router.mountSubRouter("/api", APIRoutes.get(vertx, authProvider)); 

     // Default non-handled requests: 
     router.route().handler(ctx -> { 
      ctx.fail(404); 
     }); 

     // WEBSOCKET: 

     BridgeOptions opts = new BridgeOptions() 
      .addInboundPermitted(new PermittedOptions().setAddressRegex("*")) 
      .addOutboundPermitted(new PermittedOptions().setAddressRegex("*")); 

     // Create the event bus bridge and add it to the router. 
     SockJSHandler ebHandler = SockJSHandler.create(vertx).bridge(opts, event -> { 
      if (event.type() == BridgeEventType.SOCKET_CREATED) { 
       System.out.println("A socket was created"); 
      } else { 
       System.out.println(event.type()); 
      } 

      event.complete(true); 
     }); 

     router.route("/eventbus/*").handler(ebHandler); 

     // Create the HTTP server and pass the "accept" method to the request handler. 
     vertx 
      .createHttpServer() 
      .requestHandler(router::accept) 
      .listen(
        // Retrieve the port from the configuration, 
        // default to 8080. 
        config().getInteger("http.port", 8080), 
        result -> { 
         if (result.succeeded()) { 
          fut.complete(); 
         } else { 
          fut.fail(result.cause()); 
         } 
        } 
      ); 
    } 
} 

の代わりに200を返していますSockJSHanlderを追加する代わりに、HttpServerwebsocketHandlerを使用しようとしましたが、うまくいきましたが、逆にしたいと思います。

私のテストコード:あなたのリストの高等

router.route("/eventbus/*").handler(ebHandler); 

HttpClient httpClient = client.websocket(PORT, "localhost", "/eventbus", headers, ws -> { 
    ws.handler(buffer -> { 
     JsonObject message = new JsonObject(buffer.toString()); 

     assertTrue(message.containsKey("type")); 

     ws.close(); 

     async.complete(); 
    }); 

    ws.write(Buffer.buffer("{ \"type\": \"test\"}")); 
}); 

答えて

2

あなたはハンドラを移動する必要があります。問題は、グローバルハンドラが最初に実行され、このハンドラがsockjsへのプロトコルアップグレードを処理できないことです。これらのハンドラは、次のとおりです。

router.route().handler(CookieHandler.create()); 
router.route().handler(BodyHandler.create()); 
router.route().handler(SessionHandler....); 
router.route().handler(ctx -> { 
    ctx.fail(404); 
}); 

router.route()は、彼らがあなたのプロトコルのアップグレードを妨害する任意のパスのために呼び出されますので。 sockjsハンドラを先に移動してから実行すると、コードが機能するはずです。

関連する問題