协议特定的通道处理程序

时间:2012-07-05 09:06:27

标签: java netty

我正在编写一个应用服务器,它将从网络接收 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

由于

1 个答案:

答案 0 :(得分:1)

如果您确实需要端口统一(示例here),即在同一端口上接收不同的协议,则必须在处理程序中检测协议并采取适当的操作。可以像在管道中插入不同的处理程序一样简单。

但是,我发现SIP和DNS不太可能共享同一个端口,因此无需复杂化。

我没有看过用于Netty的SIP解码器/编码器,但是根据你想要对消息做什么,HTTP解码器是一个非常好的起点(并且可以变得更简单,因为SIP不支持分块) )。

我强烈建议不要尝试在一个处理程序(或任何其他组合)中组合DNS和SIP解码。保持处理程序尽可能简单和连贯。如果需要,可以组合处理程序。