我有一个在OSGi插件中运行的Netty服务器(基本上取自Netty示例ObjectEchoServer)。服务器绑定到端口51515并且正在以它应该的方式工作。到目前为止,我理解了基本概念。
现在我需要在我的插件中添加某种“嵌入式Http”服务器。我从Netty示例中获取了HTTPServer并对其进行了修改,以满足我的需求。服务器绑定到单独的端口51516。
我需要一些帮助,将两台服务器放在一起。两个serverse只在他们的处理程序上有所不同。
ObjectEcho
extends SimpleChannelInboundHandler<Object>
而HTTPServer
extends SimpleChannelInboundHandler<FullHttpRequest>
是否可以只有一个可用于两个服务器的处理程序?
我想要实现的是两台服务器只使用一个端口。
答案 0 :(得分:0)
如果你仍然有2个不同的端口,你可以通过Java遗产构建自己的“业务”处理程序,然后首先添加协议处理程序(echo one和http one),然后再添加你自己的业务处理程序。
当然,一切都取决于传递给这个业务处理程序的可能对象,因为它必须是相同的,无论echo或http处理程序在第一时间做什么。
顺便说一下,将“协议”与“业务”处理程序分开是一个好习惯......
更新回复:
在您的管道中,对于两个服务器(2个端口),首先使用ChannelDuplexHandler
而不是SimpleChannelInboundHandler
的扩展名添加“协议”驱动程序,然后添加您自己的业务处理程序(基于SimpleChannelInboundHandler
)。
从协议业务中,根据需要转发到入站业务处理对象并返回对象,以便ChannelDuplexHandler
转换回协议。
这样,您就可以分离协议(编解码器)和业务。
即使它不是你想要的,你可以看一下示例/ src / main / java / io / netty / example / spdy / client,它们展示了如何做到这一点(客户端,但服务器端是完全相同的原则)。
第二次更新:
要只有一个端口,它会更复杂,因为您需要使用先前的ChannelDuplexHandler
来分析第一个字节以识别正确的协议类型。然后,您可以动态地向管道提供必要的处理程序(协议和业务)。
因此,首先,您的管道中只有一个处理程序,即决定必须使用哪个协议的处理程序。
但请注意,这可能很困难。除非您在确保协议的第一个字节中有明显的差异,否则您可能没有真正的解决方案,除了有两个端口,因为程序必须是确定性的。