将 2 个 Netty 服务器合并为一个

Combine 2 Netty servers into a single one

我有一个 Netty 服务器(基本上取自 Netty 示例 ObjectEchoServer),它是 运行 在 OSGi 插件中。服务器绑定到端口 51515 并且正常工作。到目前为止,我了解基本概念。

现在我还需要在我的插件中添加某种 "embedded Http" 服务器。我从 Netty 示例中提取了 HTTPServer 并对其进行了修改,使其满足我的需求。服务器绑定到一个单独的端口 51516。

我需要一些帮助,将两个服务器放在一起。两个服务器仅在处理程序上有所不同。

ObjectEcho

extends SimpleChannelInboundHandler<Object> 

而 HTTPServer

extends SimpleChannelInboundHandler<FullHttpRequest>

是否可以只有一个处理程序可用于两个服务器?

我想实现的是两台服务器只使用一个端口。

如果您仍然有 2 个不同的端口,您可以通过 Java 继承构建您自己的 "business" 处理程序,然后首先添加协议处理程序(echo 一个和 http 一个),然后在第二个您自己的业务经理。

当然,一切都取决于传递给此业务处理程序的可能对象,因为它必须相同,无论 echo 或 http 处理程序第一次做什么。

顺便说一下,将 "protocol" 与 "business" 处理程序分开是一个很好的做法...

更新回复:

在您的管道中,对于两个服务器(2 个端口),首先使用扩展名 ChannelDuplexHandler 而不是 SimpleChannelInboundHandler 添加 "protocol" 驱动程序,然后添加您自己的业务处理程序(基于 SimpleChannelInboundHandler)。

从协议业务中,根据需要将对象转发到入站业务处理程序,然后 return 将对象转发到 ChannelDuplexHandler 转换回协议。

这样,您就将协议(编解码器)和业务分开了。

即使不完全是你想要的,你也可以看看example/src/main/java/io/netty/example/spdy/client里面的操作方法(client端,不过server端是完全一样的原理)

第二次更新:

如果只有一个端口,则比较复杂,因为您随后需要访问前一个 ChannelDuplexHandler,后者将分析第一个字节以识别正确的协议类型。然后您可以动态地向管道提供必要的处理程序(协议和业务)。

所以一开始,您的管道中只有一个处理程序,即决定必须使用哪种协议的处理程序。

但是请注意,这可能很困难。除非您在确保协议的第一个字节中有明确的差异,否则您可能没有真正的解决方案,除了有两个端口,因为程序必须是确定性的。