如何使用 netty 执行以下操作:
- 如果 uri 开始“/static/*”路径,则使用 StaticHttpHandler
- 如果其他 uri 使用 HttpHandler
- 如果“/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/