Vert.x WebSocket 返回 200 而不是 101
Vert.x WebSocket returning 200 instead of 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());
}
}
);
}
}
我没有添加 SockJSHanlder
,而是尝试在 HttpServer
上使用 websocketHandler
,而且效果很好,但我想反过来做。
我的测试代码:
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\"}"));
});
您应该移动处理程序:
router.route("/eventbus/*").handler(ebHandler);
在您的列表中排名靠前。问题是您有将首先执行的全局处理程序,并且不允许此处理程序处理到 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 处理程序移动到那些应该首先执行的处理程序之前,您的代码应该可以工作。
我正在尝试设置基本的 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());
}
}
);
}
}
我没有添加 SockJSHanlder
,而是尝试在 HttpServer
上使用 websocketHandler
,而且效果很好,但我想反过来做。
我的测试代码:
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\"}"));
});
您应该移动处理程序:
router.route("/eventbus/*").handler(ebHandler);
在您的列表中排名靠前。问题是您有将首先执行的全局处理程序,并且不允许此处理程序处理到 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 处理程序移动到那些应该首先执行的处理程序之前,您的代码应该可以工作。