2013-07-29 32 views
0

我正在使用4.0.4版本。在我的項目中有兩種類型的協議。一個是消息,另一個是命令。當通道激活時,我如何區分兩種協議類型?

我順利地通過參考portunification例如區分。但是我發現區分邏輯是在decode方法中編碼的。這意味着我只能通過首先發送消息來識別它們。吼是代碼:

@Override 
protected void decode(ChannelHandlerContext ctx, ByteBuf in, 
     List<Object> out) throws Exception { 
    if (in.readableBytes() < 4) { 
     return; 
    } 
    int identifier = in.getUnsignedByte(in.readerIndex()); 
    if(identifier == 'C') { 
     switchToCommand(ctx); 
    } else { 
     switchToMessage(ctx); 
    } 
} 
private void switchToCommand(ChannelHandlerContext ctx) { 
     ChannelPipeline p = ctx.pipeline(); 
     p.addLast(new CommandHandler()); 
     p.remove(this); 
} 

private void switchToMessage(ChannelHandlerContext ctx) { 
     ChannelPipeline p = ctx.pipeline(); 
     p.addLast(new MessageHandler()); 

} 

更糟糕的是它可能不是我CommandHandlerMessageHandler內觸發channelActive事件。我認爲channelRegistered也不起作用。

當頻道被激活時,有什麼辦法可以區分它們嗎?或者我應該如何處理我的情況?因爲我想在channelActive中做某些事情,例如發送歡迎消息或將頻道添加到羣組。 謝謝!

+0

你想確定協議的種類而不檢查數據?這將是猜測,或魔術。 –

回答

0

如果沒有先讀取一些數據,沒有辦法檢測協議......該如何工作?

你應該使用有關檢測協議的ChannelPipeline通知其他處理程序是使用ctx.fireUserEventTriggered(..),並通過在自己的事件。處理程序然後可以重寫userEventTriggered(..)並處理它。

+0

謝謝你的回答。但UserEvent對我來說可能非常困難。我更喜歡遵循netty提供的事件處理。 – Michael

相關問題