/**
* 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读取通道内的数据
//拿到已经连接上的客户端集合向所有客户端写出该次获取的内容
}