package shenqi.socket; /** * Created by shenqi on 18/6/2. */ import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; import java.net.Socket; 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.Iterator; /** * Nio * 增加了一个重要角色(Selector),负责调度 * 阻塞方式改成了非阻塞 */ public class NioDemo { //通道管理器 private Selector selector; public void initServer(int port) throws IOException{ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); //设置为非阻塞 serverSocketChannel.configureBlocking(false); serverSocketChannel.socket().bind(new InetSocketAddress(port)); this.selector = Selector.open(); //监听事件 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println("服务已启动..."); } public void listenSelector(SelectionKey selectionKey)throws IOException{ //轮询监听selector while (true){ //等待客户连接 select模型 多路复用 this.selector.select(); Iterator<SelectionKey> iterator = this.selector.selectedKeys().iterator(); while (iterator.hasNext()){ SelectionKey key = iterator.next(); iterator.remove(); //处理请求 handler(key); } } } /** * 处理客户端请求 * @param key */ public void handler(SelectionKey key) throws IOException{ if (key.isAcceptable()){ //处理客户端连接请求事件 ServerSocketChannel serverSocketChannel = (ServerSocketChannel)key.channel(); SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.register(selector,SelectionKey.OP_ACCEPT); }else if (key.isReadable()){ SocketChannel socketChannel = (SocketChannel)key.channel(); ByteBuffer byteBuffer = ByteBuffer.allocate(1024); int readData = socketChannel.read(byteBuffer); if (readData > 0){ String info = new String(byteBuffer.array(),"GBK").trim(); System.out.println("服务端收到数据" + info); }else { System.out.println("客户端关闭了..."); key.cancel(); } } } }
写一个非阻塞nio模型
最新推荐文章于 2021-12-26 13:15:56 发布