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

时间:2017-01-26 16:12:02

标签: netty

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

现在我需要在我的插件中添加某种“嵌入式Http”服务器。我从Netty示例中获取了HTTPServer并对其进行了修改,以满足我的需求。服务器绑定到单独的端口51516。

我需要一些帮助,将两台服务器放在一起。两个serverse只在他们的处理程序上有所不同。

ObjectEcho

extends SimpleChannelInboundHandler<Object> 

而HTTPServer

extends SimpleChannelInboundHandler<FullHttpRequest>

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

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

1 个答案:

答案 0 :(得分:0)

如果你仍然有2个不同的端口,你可以通过Java遗产构建自己的“业务”处理程序,然后首先添加协议处理程序(echo one和http one),然后再添加你自己的业务处理程序。

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

顺便说一下,将“协议”与“业务”处理程序分开是一个好习惯......

更新回复:

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

从协议业务中,根据需要转发到入站业务处理对象并返回对象,以便ChannelDuplexHandler转换回协议。

这样,您就可以分离协议(编解码器)和业务。

即使它不是你想要的,你可以看一下示例/ src / main / java / io / netty / example / spdy / client,它们展示了如何做到这一点(客户端,但服务器端是完全相同的原则)。

第二次更新:

要只有一个端口,它会更复杂,因为您需要使用先前的ChannelDuplexHandler来分析第一个字节以识别正确的协议类型。然后,您可以动态地向管道提供必要的处理程序(协议和业务)。

因此,首先,您的管道中只有一个处理程序,即决定必须使用哪个协议的处理程序。

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

相关问题