yuristry

yuristry

[WIP] Nettyを使用してIMを構築する(1)

  1. 📘基礎知識:NIO と IO
    少啰嗦!一分钟带你读懂 Java 的 NIO 和经典 IO 的区别 - 网络编程 / 专项技术区 - 即时通讯开发者社区!(52im.net)
    NIO 和 IO
    IO からブロックストリームでデータを読み取る
InputStream input = ... ;

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

NIO
Channel とバッファに依存しており、Channel は読み書き可能な双方向であり、IO の InputStream と OutputStream のサブクラスとは異なります;

ByteBuffer buffer = ByteBuffer.allocate(48);

int bytesRead = inChannel.read(buffer);

// バッファが必要なデータを書き込むために十分に書き込まれたかどうかを確認します
while (! bufferFull(bytesRead) ) {
    bytesRead = inChannel.read(buffer);
}

例:(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 コンポーネントは、さまざまなチャネルイベントを処理するために使用できます;
@Override
protected void initChannel(Channel ch) {
    ChannelPipeline channelPipeline = ch.pipeline();
    //  ChannelHandlerチェーン
    channelPipeline.addLast()
}
  1. ChannelInboundHandlerAdapter
    ChannelInboundHandlerAdapter クラスを継承し、特定のチャネル処理を実装します
    @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();
    }
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。