我正在编写一个应用服务器,它将从网络接收 SIP 和 DNS 消息。
当我收到来自网络的消息时,我从文档中了解到,起初我得到ChannelBuffer
。我想确定已收到哪种消息(SIP或DNS)并对其进行解码。
要确定消息类型,我可以将端口专用于每种类型的消息,但我很想知道是否存在其他解决方案。我的问题更多是关于如何解码ChannelBuffer
。
Netty是否提供ChannelHandler
来解码SIP或DNS消息?如果没有,那么在类型层次结构中编写自定义ChannelHandler
的正确位置是什么?
为了说明我的问题,我们以HttpRequestDecoder
为例,层次结构为:
java.lang.Object
org.jboss.netty.channel.SimpleChannelUpstreamHandler
org.jboss.netty.handler.codec.frame.FrameDecoder
org.jboss.netty.handler.codec.replay.ReplayingDecoder<HttpMessageDecoder.State>
org.jboss.netty.handler.codec.http.HttpMessageDecoder
org.jboss.netty.handler.codec.http.HttpRequestDecoder
另外,我是否需要使用两个不同的ChannelHandler
进行解码和编码,或者是否有可能为这两个使用单个ChannelHandler
?
由于
答案 0 :(得分:1)
如果您确实需要端口统一(示例here),即在同一端口上接收不同的协议,则必须在处理程序中检测协议并采取适当的操作。可以像在管道中插入不同的处理程序一样简单。
但是,我发现SIP和DNS不太可能共享同一个端口,因此无需复杂化。
我没有看过用于Netty的SIP解码器/编码器,但是根据你想要对消息做什么,HTTP解码器是一个非常好的起点(并且可以变得更简单,因为SIP不支持分块) )。
我强烈建议不要尝试在一个处理程序(或任何其他组合)中组合DNS和SIP解码。保持处理程序尽可能简单和连贯。如果需要,可以组合处理程序。