gpt4 book ai didi

java - Netty 和多个处理程序

转载 作者:行者123 更新时间:2023-12-02 03:09:04 28 4
gpt4 key购买 nike

如何使用 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/

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