在第1篇,我們繼承ChannelInboundHandlerAdapter後,即可收到消息並處理。本篇介紹其更多的用法
基本概念
- Channel:可以理解爲一個連接,每一個客戶端連到服務器,都會有一個與之對應的Channel。
- ChannelHandler:用來處理Channel中的各種事件。
- ChannelInboundHandlerAdapter:入站ChannelHandler,即從客戶端進入服務器的各種事件。
- ChannelHandlerContext:每個處理事件的方法都有這個參數,可用於執行與當前Channel相關的各種操作。
捕獲ChannelInboundHandlerAdapter事件
public class EchoServerHandler extends ChannelInboundHandlerAdapter{
public void channelRegistered(ChannelHandlerContext ctx) {
System.out.println("註冊");
}
public void channelActive(ChannelHandlerContext ctx) {
System.out.println("激活");
}
public void channelInactive(ChannelHandlerContext ctx) {
System.out.println("斷開");
}
public void channelUnregistered(ChannelHandlerContext ctx) {
System.out.println("註銷");
}
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println("讀取消息");
}
public void channelReadComplete(ChannelHandlerContext ctx) {
System.out.println("消息讀取完成");
}
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
System.out.println("用戶事件");
}
public void channelWritabilityChanged(ChannelHandlerContext ctx){
System.out.println("可寫狀態變更爲"+ctx.channel().isWritable());
}
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
System.out.println("發生異常");
}
入站事件介紹
- 註冊和激活:當客戶端連接時,首先會觸發註冊,進行一些初始化的工作,然後激活連接,就可以收發消息了。
- 斷開和註銷:當客戶端斷開時,反向操作,先斷開,再註銷。
- 讀取消息:當收到客戶端消息時,首先讀取,然後觸發讀取完成。
- 發生異常:不多解釋了。
- 用戶事件:由用戶觸發的各種非常規事件,根據evt的類型來判斷不同的事件類型,從而進行不同的處理。
- 可寫狀態變更:收到消息後,要回復消息,會先把回覆內容寫到緩衝區。而緩衝區大小是有一定限制的,當達到上限以後,可寫狀態就會變爲否,不能再寫。等緩衝區的內容被沖刷掉後,緩衝區又有了空間,可寫狀態又會變爲是。