2014-06-30 53 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