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();
    }
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。