java - Netty 和多个处理程序

标签 java netty

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

  1. 如果 uri 开始“/static/*”路径,则使用 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协议(protocol)呢?

最佳答案

在您自己的 HttpHandler 中,您必须首先检查 uri,然后决定运行哪个“真正的”处理程序。为此,有两种方法:

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

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

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

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

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

关于java - Netty 和多个处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41332402/

相关文章:

java - 当表数据更改时,JTable 多选会失去选择

java - 从 PdfPTable 列(iText)获取绝对宽度

java - 计算 float 有多长

java - Android 布局文件中的数据绑定(bind)错误

io.netty.channel.AbstractChannel$AnnotatedConnectException : Connection Time out: No further Information:

java - Netty IO 无所事事的编解码器?

java - 扩展 DefaultChannelGroup

java - HTTP组件、ReSTLet、Apache Mina和Netty的区别

java - 在 JSP 中验证表单

java - RxNetty 重用连接