2012-07-05 60 views
0

我正在写一个应用程序服务器,它将接收来自网络的SIPDNS消息。协议特定的通道处理程序

当我收到来自网络的消息时,我从文档中了解到,起初,我得到一个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

如果真有端口统一(一个例子here),即在接收到相同的端口上不同的协议的要求,那么你将不得不检测协议中的处理程序,并采取适当的行动。可能就像在管道中插入不同的处理程序一样简单。

但是,我发现SIP和DNS将共享相同的端口是非常不可能的,因此不需要使事情复杂化。

我还没有看到Netty的SIP解码器/编码器,但取决于您想要对消息做什么,HTTP解码器是一个非常好的起点(并且可以变得更简单,因为chunking不受支持啜)。

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

+0

HttpRequestDecoder从FrameDecoder间接继承。由于我使用UDP,与我的SIP解码器是否也从FrameDecoder继承有关?另外,在我最后一个问题中,我并不是指在一个处理程序中结合DNS和SIP解码,而是在一个处理程序中编码和解码(可能使用上游和下游的处理程序)。 – 2012-07-05 13:24:26

+0

至于UDP和FrameDecoder:我不认为它很痛,但是你必须确保#messageReceived()在一次调用中获得完整的数据报包,因为Content-Length头对UDP不是强制性的。 – 2012-07-05 14:47:40

相关问题