2016-12-26 59 views
0

如何做网状如下:的Netty和多处理器

  1. 如果URI开始 “/静态/ *” 路径中使用StaticHttpHandler
  2. 如果其他URI使用的HttpHandler
  3. 如果 “/ WS” 使用WebSocketHandler

现在我有这样的代码:

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? 
    } 
} 

我可以在管道中使用诸如“swither”之类的东西吗?或者它没有意义,我需要处理处理程序中的请求uri。但如何确定websocket协议?

回答

1

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

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

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

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

  • 一旦一个通道连接,是否所有请求都进入它的性质?如果是这样,那么你可以安全地添加必要的处理程序,甚至删除HttpRouteHandler。
  • 如果没有,那么对于每个请求,你必须决定添加/根据需要进行删除必要的处理,保持HttpRouteHandler在管道来处理新形势下

说它短,你想在Web服务中实现路由解析。