Java 特定于协议的通道处理程序

Java 特定于协议的通道处理程序,java,netty,Java,Netty,我正在编写一个应用服务器,它将从网络接收SIP和DNS消息 当我收到来自网络的消息时,我从文档中了解到,首先,我得到一个ChannelBuffer。我想确定接收到哪种消息(SIP或DNS)并对其进行解码 为了确定消息类型,我可以为每种类型的消息指定端口,但我想知道是否存在其他解决方案。我的问题更多的是关于如何解码通道缓冲区 Netty是否提供ChannelHandler来解码SIP或DNS消息?如果不是,那么在类型层次结构中什么位置才是编写自定义ChannelHandler的正确位置 为了说明我

我正在编写一个应用服务器,它将从网络接收SIPDNS消息

当我收到来自网络的消息时,我从文档中了解到,首先,我得到一个
ChannelBuffer
。我想确定接收到哪种消息(SIP或DNS)并对其进行解码

为了确定消息类型,我可以为每种类型的消息指定端口,但我想知道是否存在其他解决方案。我的问题更多的是关于如何解码
通道缓冲区

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
java.lang.Object
org.jboss.netty.channel.SimpleChannelUpstreamHandler
org.jboss.netty.handler.codec.frame.FrameDecoder
org.jboss.netty.handler.codec.replay.ReplayingDecoder
org.jboss.netty.handler.codec.http.HttpMessageDecoder
org.jboss.netty.handler.codec.http.HttpRequestDecoder
另外,我是否需要使用两个不同的
ChannelHandler
进行解码和编码,或者是否可以同时使用一个
ChannelHandler


谢谢

如果您确实需要端口统一(例如),即在同一端口上接收不同的协议,那么您必须在处理程序中检测协议并采取适当的措施。可以简单到在管线中插入不同的处理程序

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

我还没有看到Netty的SIP解码器/编码器,但根据您想要对消息执行的操作,HTTP解码器是一个非常好的起点(并且可以简化,因为SIP中不支持分块)


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

HttpRequestDecoder间接从FrameDecoder继承。由于我使用UDP,我的SIP解码器是否也从FrameDecoder继承?另外,在我的最后一个问题中,我不是说在一个处理程序中结合DNS和SIP解码,而是在一个处理程序中编码和解码(可能使用上游和下游处理程序)。至于UDP和FrameDecoder:我不认为这有什么坏处,但您必须确保#messageReceived()在一次调用中获得完整的数据报数据包,因为内容长度标头对于UDP不是必需的。