书接上文
上一篇博客说了一下SelectionKey这个对象的一些常用属性,为这一篇文章的NIO服务器实例算是做了一些铺垫。不过在展示服务端实例代码之前,还要说几点细节上的东西。
Selector如何选择就绪的通道
//这个方法可能会阻塞,直到至少有一个已注册的事件发生,或者当一个或者更多的事件发生时
selector.select();
NIO明明是非阻塞的IO,为何会阻塞
这是第一章Java NIO学习(一)NIO相关概念中说的内容,作为非阻塞的IO操作,NIO为何会有这么一个可能会造成阻塞的方法呢,别急,selector对象有很多方法可以解决阻塞的问题!
//阻塞在select()方法上的线程也可以立刻返回,不阻塞
selector.selectNow();
//可以设置超时时间,防止进程阻塞
selector.select(long timeout);
//可以唤醒阻塞状态下的selector
selector.wakeup();
NIO服务端实例
本代码实例模拟一个游戏服务器,监听玩家上线的事件。
package nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterato