解释:NIO → non-blocking input output(非阻塞式的输入和输出)
使用场景:一般用于高并发场景下;请求 (客户端)、响应 (服务端)两方,约定好使用TCP/IP通信;双方约定好报文格式 (报文头+报文体)及编码格式 (这里用UTF-8),报文头内容 (约定好长度比如8位,不够前面补零)里面内容为报文体长度,再根据报文头内容,获取后面的报问体的内容。
例如:报文示例: 00000007aaaaaaa;报文体内容为7个a,所以报文头长度为7不够八位前面补零。
一、 服务端
NioServerThread: nio的服务类(selector、buffer、channel)
ServerThreadOperate: 新线程用来处理客户端请求
/**
* selector轮询线程的开启并绑定channel通道
* @author zhb
*/
public class NioServerThread {
private static int count = 0;
// 事件轮询器
private static Selector selector;
// 服务通道
private static ServerSocketChannel serverSocketChannel;
// 开启一个服务线程
public void action() throws IOException, InterruptedException{
// 开启服务端的事件轮询器,只有这一个线程
selector = Selector.open();
// 开通服务端的socket通道
serverSocketChannel = ServerSocketChannel.open();
// socket为非阻塞
serverSocketChannel.configureBlocking(false);
// 绑定端口
serverSocketChannel.socket().bind(new InetSocketAddress(Constant.serverSocketPort));
// channel和socket绑定,注册可以接入事件
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
System.err.println("---------------------线程开启-----------------------");
handerSelector();
}
/**
* 处理轮询事件
* @throws IOException
*/
private void handerSelector() throws IOException {
while(true){
//多长时间轮询一次
// selector.select(1000);
selector.select();
//事件轮询器,查出的kernel中的所有的事件标识
Set selectedKeys = selector.selectedKeys();