Netty学习之NIO基础(四)

/**
 * java.io中最为关键的概念是流,面向流的编程
 * io设计的两个顶层的抽象类inputStream 和OutputStream 使任何一个流不可能实现即是输出流又是输入流
 * java的类不可能同时继承这两个类,所以不能有一个类同时具有这两个功能
 * java.nio中有三个核心概念,Selector,Channel,Buffer
 * nio是面向块儿block或者缓冲区buffer来编程的
 * buffer本身就是指的一块儿内存,底层实现上是个数组
 * java七种原生的数据类型都有对应的buffer类型
 * int ,byte long float char double short
 * channel可以向其写入数据或是从中读取数据的对象,类似于stream
 * 操作channel都是通过buffer来执行的,
 * 永远不会出现直接向Channel写入数据或读取数据的情况
 * 与stream不同的是channel是双向的,流只会是单向的,一个流只能是input或output
 * 由于channel是双向的因此它能更好的反映出底层操作系统的真实情况
 * 比如linux系统中底层操作系统的通道就是双向的
 * Buffer里三个字段的概念理解
 * position当前读到的位置的下一个位置
 * limit为最大操作位置的下一个位置(读或写)
 * mark
 *
 */
public class NioTest01 {
    public static void main(String[] args) {
        IntBuffer buffer = IntBuffer.allocate(10);
        for (int i = 0; i < buffer.capacity(); i ++){
            int j = new SecureRandom().nextInt(20);
            buffer.put(j);
        }
        buffer.flip();
        while (buffer.hasRemaining()){
            System.out.println(buffer.get());
        }
    }
}

public final Buffer flip() {
     limit = position;
     position = 0;
     mark = -1;
     return this;
}

 public static void main(String[] args) throws Exception {
        //服务端代码
        //创建数据传输通道
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //设置通道为非阻塞
        //通道监听一个端口
        //创建Selector对象
        //将通道绑定到Selector对象中并监听通道上的accept事件
        //死循环通过Selector来管理通道事件
        //调用select()方法阻塞等待事件发生
        //调用selectKeys()方法获取发生的所有事件
        //循环判断事件类型并做对应处理
        //如果是isAcceptable()则强转为ServerSocketChannel调用accept方法获取SocketChannel
        //将获取到的客户端放到一个预先生成的集合对象里便于后续操作
        //将上步骤获取到的客户端SocketChannel对象注册到Selector上关注read事件
        //如果是isReadable()则强转为SocketChannel对象构造ByteBuffer读取通道内的数据
        //拿到已经连接上的客户端集合向所有客户端写出该次获取的内容
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值