如何使用同一端口(使用码头 8)拥有具有多个上下文的 websocket
Posted
技术标签:
【中文标题】如何使用同一端口(使用码头 8)拥有具有多个上下文的 websocket【英文标题】:How to have websockets with multiple context using same port (using jetty 8) 【发布时间】:2014-03-11 13:26:21 【问题描述】:我尝试实现 websocket 服务器,要求是在同一个端口上有多个上下文,即
ws://ip:8989/provider1
ws://ip:8989/provider2
应该提供两个不同的连接但在同一个端口上。
我按照旧文章 How do I create an embedded WebSocket server Jetty 9? 创建上下文处理程序。
我尝试下面的代码来创建两个单独的上下文
ContextHandler context = new ContextHandler();
context.setContextPath("/provider1");
context.setHandler(wsHandler);
server.addHandler(context);
ContextHandler context = new ContextHandler();
context.setContextPath("/provider2");
context.setHandler(wsHandler);
server.addHandler(context);
server.start();
server.join();
但我只在第二个上下文中获取数据。这是正确的实现吗?
即使我让它工作了,我也有最终要求,我必须即时打开/创建上下文,即在使用第一个上下文启动服务器之后。
有人可以解释如何使用单端口实现这些要求吗?
【问题讨论】:
【参考方案1】:您的问题是Jetty 8 Server Class 中只能有一个处理程序,因为没有addHandler。
处理程序是一个包装类,它们可以像套娃一样进行配置。这是创建一个处理程序集合(HandlerCollection)并将两个上下文处理程序放在这里。这个类有addHandler方法
代码如下
// Collection
HandlerCollection hc = new HandlerCollection();
// First context
ContextHandler context = new ContextHandler();
context.setContextPath("/provider1");
context.setHandler(wsHandler);
hc.addHandler(context)
// Second context
ContextHandler context2 = new ContextHandler();
context2.setContextPath("/provider2");
context2.setHandler(wsHandler2);
hc.addHandler(context2)
server.setHandler(hc);
server.start();
server.join();
【讨论】:
试过这个不起作用,webscoket onConnect 和 onClose 方法被调用但是 onText 没有被调用 wsHandler以上是关于如何使用同一端口(使用码头 8)拥有具有多个上下文的 websocket的主要内容,如果未能解决你的问题,请参考以下文章
text 使用SSL在同一域上具有多个端口应用的Nginx配置。
Maven - POM:如何使码头端口可变,以便以后可以检索?
使用Inno Setup安装具有不同配置的同一Windows服务的多个实例