2014-06-30 25 views
2

我试图连接到发送许多不同数据包类型的tcp/ip接口。每个数据包的长度和内容都不相同。我只想处理每个数据包类型并生成POJO,这些POJO将由另一个状态处理程序再次处理。 到目前为止,我不确定在Netty中是否有支持这种类型的处理数据包/帧的结构。我能想到的一个解决方案是创建一个解码器入站处理程序,它根据第一个字节(类型字段)来操作管道。 Netty中的哪种结构或算法可以帮助我实现这种简单的开关问题?Netty:处理很多不同的数据包类型

THX, 汤姆

回答

4

如果你的连接应该处理相同的数据包类型的第一分组类型的流(即第一个数据包决定了连接的状态),您可以查看the port unification example

如果你的连接应该处理任意数据包类型的流,你最好写一个理解所有数据包类型并将它们转换为POJO的解码器。除非要处理的包类型数量太多,否则不应该很困难。一旦解码器解码包,你在管道最后一个处理程序将如下所示:

public class MyPacketHandler extends SimpleChannelInboundHandler { 
    @Override 
    public void channelRead0(ChannelHandlerContext ctx, Object msg) { 
     if (msg instanceof MsgA) { 
      handleA(ctx, (MsgA) msg); 
     } else if (msg instanceof MsgB) { 
      handleB(ctx, (MsgB) msg); 
     } ... 
    } 

    private void handleA(ChannelHandlerContext ctx, MsgA msg) { 
     ... 
    } 
    ... 
} 

如果你不喜欢繁琐的if-else块,你可以利用一个java.util.MapClass.isAssignableFrom()的。

+0

我想你描述的第二种情况适合我的问题。但这意味着netty的管道结构并不能帮助我使用自己的协议和消息 - 对吗?正如你所说的,Packethandler是管道中的最后一个处理程序...... – Tom

+0

是的,你是对的。 – trustin