我試圖連接到發送許多不同數據包類型的tcp/ip接口。每個數據包的長度和內容都不相同。我只想處理每個數據包類型並生成POJO,這些POJO將由另一個狀態處理程序再次處理。 到目前爲止,我不確定在Netty中是否有支持這種類型的處理數據包/幀的結構。我能想到的一個解決方案是創建一個解碼器入站處理程序,它根據第一個字節(類型字段)來操作管道。 Netty中的哪種結構或算法可以幫助我實現這種簡單的開關問題?Netty:處理很多不同的數據包類型
THX, 湯姆
我試圖連接到發送許多不同數據包類型的tcp/ip接口。每個數據包的長度和內容都不相同。我只想處理每個數據包類型並生成POJO,這些POJO將由另一個狀態處理程序再次處理。 到目前爲止,我不確定在Netty中是否有支持這種類型的處理數據包/幀的結構。我能想到的一個解決方案是創建一個解碼器入站處理程序,它根據第一個字節(類型字段)來操作管道。 Netty中的哪種結構或算法可以幫助我實現這種簡單的開關問題?Netty:處理很多不同的數據包類型
THX, 湯姆
如果你的連接應該處理相同的數據包類型的第一分組類型的流(即第一個數據包決定了連接的狀態),您可以查看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.Map
和Class.isAssignableFrom()
的。
我想你描述的第二種情況適合我的問題。但這意味着netty的管道結構並不能幫助我使用自己的協議和消息 - 對嗎?正如你所說的,Packethandler是管道中的最後一個處理程序...... – Tom
是的,你是對的。 – trustin