Netty和多个处理程序

时间:2016-12-26 14:04:06

标签: java netty

如何使用netty执行以下操作:

  1. 如果uri开始" / static / *" path使用StaticHttpHandler
  2. 如果其他uri使用HttpHandler
  3. if" / ws"使用WebSocketHandler
  4. 现在我有了这段代码:

    public class HttpHelloWorldServerInitializer extends ChannelInitializer<SocketChannel> {
        @Override
        public void initChannel(SocketChannel ch) {
            ChannelPipeline p = ch.pipeline();
            p.addLast(new HttpServerCodec());
            p.addLast(new HttpHandler());
    
            // Other pipelene handlers?
        }
    }
    

    我可以使用&#34; swither&#34;在管道?或者它没有意义,我需要在处理程序内处理请求uri。但是如何确定websocket协议?

1 个答案:

答案 0 :(得分:2)

在你自己的HttpHandler中,你必须首先检查uri然后决定运行哪个“真正的”处理程序。要做到这一点,有两种方法:

  • 您的业务代码(HttpHandler)中已经存在已经分配或新分配的必要对象(StaticHttpHandler和WebSocketHandler),然后通过明确调用它们将请求手动传递给它们(因此它们不再是“标准”Netty处理程序)
  • 要么有一个特定的处理程序(例如HttpRouteHandler),它决定将哪个处理程序添加到此请求的管道中,并将当前请求传递给下一个处理程序

第一个是最简单但不容易扩展。

第二个是有点困难,你必须确保/清理每个请求到达正确的处理程序。例如,

  • 一旦频道被连接,所有请求都会进入同一性质的请求吗?如果是这样,那么您可以安全地添加必要的处理程序,甚至删除HttpRouteHandler。
  • 如果没有,则对于每个请求,您必须决定根据需要添加/删除必要的处理程序,将HttpRouteHandler保留在管道中以处理新的上下文

简而言之,您正在尝试在Web服务中实现路由解析。