将 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
,后者将分析第一个字节以识别正确的协议类型。然后您可以动态地向管道提供必要的处理程序(协议和业务)。
所以一开始,您的管道中只有一个处理程序,即决定必须使用哪种协议的处理程序。
但是请注意,这可能很困难。除非您在确保协议的第一个字节中有明确的差异,否则您可能没有真正的解决方案,除了有两个端口,因为程序必须是确定性的。
我有一个 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
,后者将分析第一个字节以识别正确的协议类型。然后您可以动态地向管道提供必要的处理程序(协议和业务)。
所以一开始,您的管道中只有一个处理程序,即决定必须使用哪种协议的处理程序。
但是请注意,这可能很困难。除非您在确保协议的第一个字节中有明确的差异,否则您可能没有真正的解决方案,除了有两个端口,因为程序必须是确定性的。