Nio(Selector(选择器))处理accept)
Selector(允许单个线程管理多个channel)其实是分情况的在没有事件发生的时候是个阻塞线程停止,(线程休息一下)。
这一节就是讲的,一个服务器端的serverSocketChannel(用来模拟服务器端)先注册到selector,然后会将其中的ssckey复制到selector的seletorkeys这个集合(其中selector是一个东西,后面的selector.selectorKeys是一个东西)。后面才是客户端建立连接的通道,也方法selectorKeys这个集合,最后他会遍历这个集合打印出来。。。(我们事件的流程都是先注册,再复制,再轮询复制的东西(我们channel注册给selector,selector会把一个key和channel关联起来的。(这个key包含了channel关注的一切问题。(三个参数嘛))))
第一步:我么先创建选择器selector.open()

第二步:将channel注册到selector(这个channel还必须是非阻塞的,即channel.configureBlocking(false))注册用的channel.register(selector,对什么感兴趣,)
Connect, 即连接事件(TCP 连接), 对应于SelectionKey.OP_CONNECT
Accept, 即确认事件, 对应于SelectionKey.OP_ACCEPT
Read, 即读事件, 对应于SelectionKey.OP_READ, 表示 buffer 可读.
Write, 即写事件, 对应于SelectionKey.OP_WRITE, 表示 buffer 可写.

第三步:selector.select方法(没有时间发生就线程阻塞,有时间发生就线程恢复运行态(先变为就绪态))

第四步:!!!得到一个selector.selectorKeys的集合(和前面注册到selector的通道(还关注的事件)是两个东西)其中这个是将上面的selector中的复制到这上面来处理,我们先拿到事件集合(是一个set集合)。若是想要删除的话我们需要用迭代用迭代器(Iterator)来遍历(我们想要再集合遍历的时候还想要删除要用迭代器遍历(若是我们用增强for遍历时还想要删除就会报错))

第五步:是我我们根据我们的遍历(selector.selectorKeys)去建立连接

测试:

然后我们启动一个客户端,这个就会触发上面的兴趣事件咯,所以就会到一个set集合我们再遍历这个集合再去打印,最后是我们去进行这个连接里咯(根据前面的客户端连接建立连接),这里打印了相同的东西,是前面我们启动服务器端,已经将severSocketchannel注册到seletor啊,后面我们启动客户端,他往下走进行遍历。然后会将其中的ssckey复制到selector的seletorkeys这个集合(其中selector是一个东西,后面的selector.selectorKeys是一个东西)。后面才是客户端建立连接的通道,也方法selectorKeys这个集合,最后他会遍历这个集合打印出来。。。




总结:
说一下这个程序的理解,其中我们的ServerSoketChannel 是一个通道,他的作用就是可以监听那些tcp连接,这个accept就是连接建立。没有连接进来就是阻塞态咯。
这里我们演示只是一个让客户端来连接我们的服务器。这个服务器的意思其实就是一个通道而已,serverSocketChannel通道。Seletor的作用就是将通道注册到seletor。管理多个channel。这里我们还是理一下(以前),上面的是通道就是一个服务器,下面的这个accept是一个连接通道,再下面的read才是数据的读写。
!!!重点,我们将serverSocketchannel注册到了我们selector,那么就是说selector成为这个管理员了,他全权代表这个服务器了,也就是说他这个服务器也不为过的。所以seletor监听到我们事件他就会将这个事件放到这个selector的事件集合里(也就是selector.selectorKeys())
而后面我们的客户端accept建立的建立通道就是不一样的咯(和我们的serverSocketchannel 不一样)
