gpt4 book ai didi

java - 我可以在同一实例中使用 WebSocketHandler 运行 WebAppContext 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:09 24 4
gpt4 key购买 nike

是否可以同时运行 WebSocketHandler 和 WebAppContext?我使用的是最新版本 9.2.1.v20140609。我尝试了下面的配置,但是在 Websocket 调用 localhost:8080/ WebAppContext 拦截调用。这是我的启动器:

public static void main(String[] args) throws Exception
{
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.addConnector(connector);

WebAppContext context = new WebAppContext("webapp", "/");

// Setting up browser caching. Binds params for org.eclipse.jetty.servlet.DefaultServlet.init()
context.getInitParams().put("org.eclipse.jetty.servlet.Default.etags", "true");
context.getInitParams().put("org.eclipse.jetty.servlet.Default.cacheControl", "public, max-age=0");

// Fix for Windows, so Jetty doesn't lock files
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
context.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
}

// Will throw an exception when will be unable to start server for some reason
context.setThrowUnavailableOnStartupException(true);

Broker broker = new Broker();

// Implementation of org.eclipse.jetty.websocket.server.WebSocketHandler
WebSocketHandler socketHandler = new com.namespace.websocket.Handler(broker);

HandlerCollection handlerCollection = new HandlerCollection();
handlerCollection.setHandlers(new Handler[] {context, socketHandler});

server.setHandler(handlerCollection);

// Remove Server:Jetty(9...) from Response Headers
removeServerVersionFromHeaders(server);

server.start();

}

我可以从启动器运行多个 jetty 实例,只需将 WebSocket 处理程序连接到某个 5555 端口,但最好我想保留一个 Jetty 实例,并可能使用 /ws 管理 WebSocket 连接的处理程序

最佳答案

怎么样:

public class Websock {
private static class Adapter extends WebSocketAdapter {
@Override
public void onWebSocketConnect(Session sess) {
System.out.print("client connected");
}
}

public static void main(String[] args) throws Exception {
Server server = new Server(8080);

WebAppContext context = new WebAppContext("webapp", "/");
context.getServletHandler().setEnsureDefaultServlet(false); // may or may not be needed.

ContextHandlerCollection handlerCollection = new ContextHandlerCollection();
handlerCollection.addHandler(context);
handlerCollection.addHandler(createWebsocketHandler());

server.setHandler(handlerCollection);

server.start();
}

private static ContextHandler createWebsocketHandler() {
ContextHandler contextHandler = new ContextHandler("/ws");
contextHandler.setAllowNullPathInfo(true); // disable redirect from /ws to /ws/

final WebSocketCreator webSocketcreator = new WebSocketCreator() {
public Object createWebSocket(ServletUpgradeRequest request,
ServletUpgradeResponse response) {
return new Adapter();
}
};

Handler webSocketHandler = new WebSocketHandler() {
public void configure(WebSocketServletFactory factory) {
factory.setCreator(webSocketcreator);
}
};

contextHandler.setHandler(webSocketHandler);
return contextHandler;
}
}

ContextHandlerCollection 看起来像您想要的,需要一些时间来习惯将 jetty 处理程序链接在一起。

如果您不需要 WebAppContext 的功能,那么您也可以删除它并直接使用 ContextHandlers。

我自己还没有运行过,但看起来是正确的。

关于java - 我可以在同一实例中使用 WebSocketHandler 运行 WebAppContext 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24582058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com