参考 :https://wiki.jikexueyuan.com/project/java-nio-zh/java-nio-tutorial.html
SocketChannel
建立一个SocketChannel连接 open()
关闭一个SocketChannel连接 close()
从SocketChannel中读数据 read()
向SocketChannel写数据 write()
非阻塞模式
connect()
ServerSocketChannel
打开ServerSocketChannel open
关闭ServerSocketChannel close
监听链接 accept
非阻塞模式 serverSocketChannel.configureBlocking(false)
Selector
SelectorKey
Buffer
ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf); while (bytesRead != -1) { System.out.println("Read " + bytesRead); buf.flip(); while(buf.hasRemaining()){ System.out.print((char) buf.get()); } buf.clear(); bytesRead = inChannel.read(buf); } aFile.close();
利用Buffer读写数据,通常遵循四个步骤:
一个Buffer有三个属性是必须掌握的,分别是:
Channel
public class IoServer { private int port =8080; private Selector selector; private ByteBuffer buffer = ByteBuffer.allocate(1024); public IoServer(int port){ try { this.port = port; ServerSocketChannel server = ServerSocketChannel.open(); server.bind(new InetSocketAddress(this.port)); //兼容BIO server.configureBlocking(false);//设置之后为非阻塞 selector = Selector.open(); server.register(selector, SelectionKey.OP_ACCEPT); } catch (IOException e) { e.printStackTrace(); } } public void listen(){ System.out.println("listen on " + this.port); while (true){ try { selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> iterator = keys.iterator(); while (iterator.hasNext()){ SelectionKey key = iterator.next(); iterator.remove(); process(key); } } catch (IOException e) { e.printStackTrace(); } } } private void process(SelectionKey key) throws IOException { if(key.isAcceptable()){ ServerSocketChannel server = (ServerSocketChannel) key.channel(); //非阻塞 SocketChannel channel = server.accept(); channel.configureBlocking(false); key = channel.register(selector, SelectionKey.OP_READ); }else if(key.isReadable()){ // }else if (key.isWritable()){ // } } public static void main(String[] args) { new IoServer(8080).listen(); }
原文:https://www.cnblogs.com/hoper2020/p/12761703.html