yuristry

yuristry

[WIP] 使用Netty搭建IM(一)

  1. 📘基礎知識:NIO 和 IO
    少啰嗦!一分鐘帶你讀懂 Java 的 NIO 和經典 IO 的區別 - 網絡編程 / 專項技術區 - 即時通訊開發者社區!(52im.net)
    NIO 和 IO
    IO 從阻塞流中讀取數據
InputStream input = ... ;

BufferedReader reader = new BufferedReader(new InputStreamReader(input));

NIO
依賴 Channel 和 buffer,Channel 是雙向的可讀可寫,區別於 IO 中的 InputStream 和 OutputStream 的子類;

ByteBuffer buffer = ByteBuffer.allocate(48);

int bytesRead = inChannel.read(buffer);

// 檢查緩衝區是否已經寫入處理所需的足夠多的數據
while (! bufferFull(bytesRead) ) {
    bytesRead = inChannel.read(buffer);
}

e.g. (1)首先從 FileInputStream 獲取通道 (2) 然後創建緩衝區 (3) 將數據從通道讀到緩衝區中

FileInputStream fin = new FileInputStream("demo.txt");
FileChannel fc = fin.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);`
fc.read(buffer);

史上最強 Java NIO 入門:擔心從入門到放棄的,請讀這篇!- 網絡編程 / 專項技術區 - 即時通訊開發者社區!(52im.net)

  1. 💡netty 的 Channelhandler 組件,可以用來處理 Channel 的各種事件;
@Override
protected void initChannel(Channel ch) {
	ChannelPipeline channelPipeline = ch.pipeline();
	//  ChannelHandler鏈
	channelPipeline.addLast()
}
  1. ChannelInboundHandlerAdapter
    繼承 ChannelInboundHandlerAdapter 類,實現特制的 Channel 處理
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        // 從管理器中添加
        channelManager.add(ctx.channel());
    }

    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) {
        // 從管理器中移除
        channelManager.remove(ctx.channel());
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.error("[exceptionCaught][連接({}) 發生異常]", ctx.channel().id(), cause);
        // 斷開連接
        ctx.channel().close();
    }
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。