简体   繁体   English

Vert.x WebSocket返回200而不是101

[英]Vert.x WebSocket returning 200 instead of 101

I'm trying to set up a basic HTTP and WebSocket Vert.x server, but the WebSocket route is always returning a 200 instead of a 101. 我正在尝试设置基本的HTTP和WebSocket Vert.x服务器,但是WebSocket路由始终返回200而不是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());
                        }
                    }
            );
    }
}

Instead of adding a SockJSHanlder , I have tried to use websocketHandler on the HttpServer , and that's working fine, but I would like to do it the other way around. 我没有添加SockJSHanlder ,而是尝试在HttpServer上使用websocketHandler ,并且工作正常,但我想采用其他方法。

My test code: 我的测试代码:

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\"}"));
});

You should move the handler: 您应该移动处理程序:

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

Higher in your list. 在您的列表中较高。 The issue is that you have global handlers that will be executed first and will not allow this handler to process the protocol upgrade to sockjs. 问题是您拥有将首先执行的全局处理程序,并且将不允许该处理程序处理升级到sockjs的协议。 These handlers are: 这些处理程序是:

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

Since router.route() will be called for any path they will interfere with your protocol upgrade. 由于将在任何路径下调用router.route()因此它们将干扰协议升级。 If you move the sockjs handler before those it should be executed first and your code should work. 如果将sockjs处理程序移到它们之前,则应首先执行它,并且代码应该可以工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM