PDF
I/O 1Linux I/OJava NIOContentsI/O ................................................................................................ 1JavaI/O .......................................................................................... 3使I/O I/OBlocking I/Odata = recvfrom(socket)Non-blocking I/OEWOULDBLOCKpolling I/O 2do { data = recvfrom(socket)} while(data == EWOULDBLOCK)I/O multiplexingselectpoolepollwhile(true) { socket = select(sockets) // socket data = recvfrom(socket) // processblock}while(1){ FD_ZERO(&rset); for (i = 0; i< 5; i++ ) { FD_SET(fds[i],&rset); } puts("round again"); select(max+1, &rset, NULL, NULL, NULL); for(i=0;i<5;i++) { if (FD_ISSET(fds[i], &rset)){ memset(buffer,0,MAXBUF); read(fds[i], buffer, MAXBUF); puts(buffer); } } }使select使poolepoll使线recvfrom线Signal driven I/OsigactionSIGIOhandler = () -> { recvfrom(socket)}sigaction(socket, handler)Asynchronous I/O JavaI/O3JavaI/Oblocking I/O线public class EchoServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(); server.bind(new InetSocketAddress(9000)); while (true) { Socket socket = server.accept(); new Thread(clientHandler(socket)).start(); } } private static Runnable clientHandler(Socket socket) { return () -> { try { BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); String line = ""; while (!"/quit".equals(line)) { line = reader.readLine(); writer.write(line + "\n"); writer.flush(); } } catch (IOException ex) { ex.printStackTrace(); } }; }}non-blocking I/O JavaI/O4BufferByteBufferMappedByteBuffer使public class NioEchoServer { public static void main(String[] args) { try (Selector selector = Selector.open(); ServerSocketChannel serverSocket = ServerSocketChannel.open()) { serverSocket.bind(new InetSocketAddress(9999)); serverSocket.configureBlocking(false); serverSocket.register(selector, SelectionKey.OP_ACCEPT); ByteBuffer buffer = ByteBuffer.allocate(4); while (true) { selector.select(); final Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectedKeys.iterator(); while (iterator.hasNext()) { final SelectionKey key = iterator.next(); if (key.isAcceptable()) { accept(selector, serverSocket); } else if (key.isReadable()) { readAndAnswer(buffer, key); } else { throw new RuntimeException("Unsupported operation"); } iterator.remove(); } } } catch (IOException e) { e.printStackTrace(); } } private static void accept(final Selector selector, final ServerSocketChannel serverSocket) throws IOException { SocketChannel client = serverSocket.accept(); JavaI/O5 client.configureBlocking(false); client.register(selector, SelectionKey.OP_READ); } private static void readAndAnswer(final ByteBuffer buffer, final SelectionKey key) throws IOException { final SocketChannel client = (SocketChannel) key.channel(); client.read(buffer); buffer.flip(); String s = StandardCharsets.UTF_8.decode(buffer).toString(); System.out.println("-> " + s); buffer.clear(); }}Asynchronous I/OAsynchronousFileChannelAsynchronousSocketChannelAsynchronousServerSocketChannel

HTML view coming soon.

Download PDF for the full formatted version.