国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

IO/NIO交互模擬及漸進(jìn)式實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了IO/NIO交互模擬及漸進(jìn)式實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

IO

IO Server

public class SocketServer {
    public static void main(String[] args)  {
        //server編號(hào)和client編號(hào)對(duì)應(yīng),優(yōu)缺點(diǎn)注釋在server端
        //server1();
        //server2();
        server3();
    }

    /**
     * server1的缺點(diǎn):
     * 1、accept()方法阻塞了線程,要等客戶端連接后才能繼續(xù)處理(一個(gè)客戶端連接,對(duì)應(yīng)一個(gè)服務(wù)端處理線程)
     * 2、當(dāng)客戶端與服務(wù)端完成一次交互后,程序就結(jié)束了
     * 3、流關(guān)閉代碼比較臃腫、BufferedWriter的內(nèi)容需要在末尾加'\n'
     * 4、交互的內(nèi)容寫死,不可以通過控制臺(tái)輸入
     * 5、端口號(hào)固定、ip固定、readLine讀取一行等等
     */
    public static void server1() {
        ServerSocket serverSocket = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try {
            serverSocket = new ServerSocket(8999);
            //阻塞至客戶端連接成功
            Socket socket = serverSocket.accept();

            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //readLine會(huì)阻塞
            String s = bufferedReader.readLine();
            System.out.println("服務(wù)端接收到客戶端的消息:" + s);

            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bufferedWriter.write("服務(wù)端發(fā)送消息給客戶端\n");
            bufferedWriter.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //各個(gè)try catch 必須分開寫,聚合成一個(gè)會(huì)導(dǎo)致一個(gè)流關(guān)閉異常,無法進(jìn)入其他流的關(guān)閉流程
            if(serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            if(bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            //只需要關(guān)閉外層的緩沖區(qū),其close方法內(nèi)部關(guān)閉了了傳入的流
            //如果不關(guān)閉,只是等待jvm兜底finally,會(huì)在不確定的時(shí)間內(nèi)對(duì)資源造成占用(如果是文件讀寫會(huì)對(duì)文件描述符fd的占用)
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }


    /**
     * server2優(yōu)點(diǎn):
     * 1、服務(wù)端和客戶端可以任意次交互,可以連續(xù)發(fā)送消息
     * 2、優(yōu)化了流關(guān)閉的寫法
     *
     * server2的缺點(diǎn):
     * 1、accept()方法阻塞了線程,要等客戶端連接后才能繼續(xù)處理(一個(gè)客戶端連接,對(duì)應(yīng)一個(gè)服務(wù)端處理線程)
     * 2、cpu空轉(zhuǎn)
     * 3、ip固定等等
     * 4、一個(gè)服務(wù)端只能和一個(gè)客戶端交互
     */
    public static void server2() {
        System.out.println("請(qǐng)輸入端口號(hào),并等待客戶端連接...");
        try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
             ServerSocket serverSocket = new ServerSocket(Integer.valueOf(consoleReader.readLine()));
             Socket socket = serverSocket.accept();
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
        ){
            System.out.println("客戶端已連接,開始和客戶端交互...");
            //這個(gè)循環(huán)保證可以連續(xù)發(fā)送或者接收多條消息
            while (true) {
                if (bufferedReader.ready()) {
                    System.out.println("收到客戶端的消息:" + bufferedReader.readLine());
                }

                if (consoleReader.ready()) {
                    printWriter.println(consoleReader.readLine());
                    printWriter.flush();
                }
            }
            //只能發(fā)一次接收一次
//            while (true) {
//                System.out.println("收到客戶端的消息:" + bufferedReader.readLine());
//
//                printWriter.println(consoleReader.readLine());
//                printWriter.flush();
//            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * server3優(yōu)點(diǎn):
     * 一個(gè)服務(wù)端可以和一個(gè)客戶端交互
     * 加上了線程池
     *
     * server3的缺點(diǎn):
     * 1、accept()方法阻塞了線程,要等客戶端連接后才能繼續(xù)處理(一個(gè)客戶端連接,對(duì)應(yīng)一個(gè)服務(wù)端處理線程)
     * 2、cpu空轉(zhuǎn)
     * 3、ip固定等等
     * 4、如果開啟多個(gè)客戶端,因System.in被服務(wù)端共享,所以服務(wù)端發(fā)送消息后,客戶端會(huì)隨機(jī)接收其中個(gè)別消息
     */
    public static void server3() {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(0, Runtime.getRuntime().availableProcessors() * 2,
                60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>());
        System.out.println("請(qǐng)輸入端口號(hào),并等待客戶端連接...");
        try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
             ServerSocket serverSocket = new ServerSocket(Integer.valueOf(consoleReader.readLine()));
        ){
            //這個(gè)循環(huán)保證多個(gè)客戶端連接
            while (true) {
                Thread.sleep(1000);
                Socket socket = serverSocket.accept();
                System.out.println("客戶端已連接,開始和客戶端交互...");

                pool.submit(new Thread(()->{
                    try(
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                    ) {
                        while (true) {
                            Thread.sleep(1000);
                            if(bufferedReader.ready()) {
                                System.out.println("收到客戶端"+ Thread.currentThread() +"的消息:" + bufferedReader.readLine());
                            }

                            if (consoleReader.ready()) {
                                printWriter.println(consoleReader.readLine());
                                printWriter.flush();
                            }
                        }
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    } finally {
                        if(socket != null) {
                            try {
                                socket.close();
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

IO Client

public class SocketClient {
    public static void main(String[] args) {
        //client1();
        //client2();
        client3();
    }

    public static void client1() {
        Socket socket = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try {
            socket = new Socket("127.0.0.1", 8999);

            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //換行符必不可少,不然服務(wù)端readLine()無法判斷一行已經(jīng)寫完
            bufferedWriter.write("客戶端發(fā)送消息給服務(wù)端\n");
            bufferedWriter.flush();

            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String s = bufferedReader.readLine();
            System.out.println("客戶端接收到服務(wù)端的消息:" + s);

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if(socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            if(bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }


    public static void client2() {
        System.out.println("請(qǐng)輸入端口號(hào):");
        try (
                BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
                Socket socket = new Socket("127.0.0.1", Integer.valueOf(consoleReader.readLine()));
                PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        ){
            System.out.println("連接成功,開始和服務(wù)端交互");
            //可以連續(xù)發(fā)送或者接收多條消息
            while (true) {
                Thread.sleep(1000);
                if (bufferedReader.ready()) {
                    System.out.println("收到服務(wù)端的消息:" + bufferedReader.readLine());
                }

                if (consoleReader.ready()) {
                    printWriter.println(consoleReader.readLine());
                    printWriter.flush();
                }
            }
            //只能發(fā)一次接收一次
//            while (true) {
//                printWriter.println(consoleReader.readLine());
//                printWriter.flush();
//
//                System.out.println("收到服務(wù)端的消息:" + bufferedReader.readLine());
//            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public static void client3() {
        System.out.println("請(qǐng)輸入端口號(hào):");
        try (
                BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
                Socket socket = new Socket("127.0.0.1", Integer.valueOf(consoleReader.readLine()));
                PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        ){
            System.out.println("連接成功,開始和服務(wù)端交互");
            //可以連續(xù)發(fā)送或者接收多條消息
            while (true) {
                if (bufferedReader.ready()) {
                    System.out.println("收到服務(wù)端的消息:" + bufferedReader.readLine());
                }

                if (consoleReader.ready()) {
                    printWriter.println(consoleReader.readLine());
                    printWriter.flush();
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

NIO

NIO Server

public class SocketServer {
    public static void main(String[] args) {
        //server1();
        //server2();
        //server3();
        //server4();
        server5();
    }


    /**
     * 優(yōu)點(diǎn):NIO非阻塞方式,連接不會(huì)阻塞、讀寫不會(huì)阻塞
     * 缺點(diǎn):
     * 1、當(dāng)客戶端與服務(wù)端完成一次交互后,程序就結(jié)束了
     * 2、交互的內(nèi)容寫死,不可以通過控制臺(tái)輸入
     * 3、cpu空轉(zhuǎn)
     * 4、未使用selector多路復(fù)用器,其編程其實(shí)還是類似與BIO形式(服務(wù)端還是每個(gè)線程對(duì)應(yīng)一個(gè)客戶端)
     */
    private static void server1() {

        try (
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        ){
            serverSocketChannel.socket().bind(new InetSocketAddress(9999));
            serverSocketChannel.configureBlocking(false);
            //accept設(shè)置了非阻塞,因此需要放置在循環(huán)中使用,否則程序直接結(jié)束了
            while (true) {
                Thread.sleep(1000);
                SocketChannel socketChannel = serverSocketChannel.accept();
                if(socketChannel != null) {
                    System.out.println("客戶端已連接,開始和客戶端交互...");
                    socketChannel.configureBlocking(false);
                    ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                    socketChannel.read(readBuffer);
                    readBuffer.clear();

                    System.out.println("接收到客戶端消息: " + new String(readBuffer.array(), "utf-8").trim());

                    ByteBuffer writeBuffer = ByteBuffer.wrap("發(fā)送消息給客戶端".getBytes());
                    socketChannel.write(writeBuffer);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 改良:
     * 1、支持客戶端和服務(wù)端一對(duì)一交互,多發(fā)
     * 缺點(diǎn):
     * 1、不支持一個(gè)客戶端對(duì)多個(gè)服務(wù)端
     * 2、如果開啟多個(gè)客戶端,因System.in被服務(wù)端共享,所以服務(wù)端發(fā)送消息后,客戶端會(huì)隨機(jī)接收其中個(gè)別消息
     * 3、cpu空轉(zhuǎn)
     * 4、未使用selector多路復(fù)用器,其編程其實(shí)還是類似與BIO形式(服務(wù)端還是每個(gè)線程對(duì)應(yīng)一個(gè)客戶端)
     */
    private static void server2() {
        try (
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        ){
            serverSocketChannel.socket().bind(new InetSocketAddress(9999));
            serverSocketChannel.configureBlocking(false);
            //accept設(shè)置了非阻塞,因此需要放置在循環(huán)中使用,否則程序直接結(jié)束了
            while (true) {
                Thread.sleep(1000);
                SocketChannel socketChannel = serverSocketChannel.accept();
                if(socketChannel != null) {
                    System.out.println("客戶端已連接,開始和客戶端交互...");
                    socketChannel.configureBlocking(false);
                    ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                    while (true) {
                        if(socketChannel.read(readBuffer) > 0) {
                            System.out.println("接收到客戶端消息: " + new String(readBuffer.array(), "utf-8").trim());
                            readBuffer.clear();
                        }

                        if (consoleReader.ready()) {
                            ByteBuffer writeBuffer = ByteBuffer.wrap(consoleReader.readLine().getBytes());
                            socketChannel.write(writeBuffer);
                            writeBuffer.clear();
                        }
                        Thread.sleep(1000);
                    }
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 改良:
     * 1、支持一個(gè)客戶端對(duì)多個(gè)服務(wù)端
     * 缺點(diǎn):
     * 1、cpu空轉(zhuǎn)
     * 2、未使用selector多路復(fù)用器,其編程其實(shí)還是類似與BIO形式(服務(wù)端還是每個(gè)線程對(duì)應(yīng)一個(gè)客戶端)
     */
    private static void server3() {
        try (
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        ) {
            serverSocketChannel.socket().bind(new InetSocketAddress(9999));
            serverSocketChannel.configureBlocking(false);
            List<SocketChannel> socketChannels = new ArrayList<>();
            //accept設(shè)置了非阻塞,因此需要放置在循環(huán)中使用,否則程序直接結(jié)束了
            while (true) {
                Thread.sleep(1000);
                boolean ready = consoleReader.ready();
                byte[] bytes = null;
                if (ready) {
                    bytes = consoleReader.readLine().getBytes();
                }
                //調(diào)用一次accept再次使用會(huì)變成成null,除非有新的客戶端連接
                SocketChannel socketChannel = serverSocketChannel.accept();
                if (socketChannel != null) {
                    socketChannels.add(socketChannel);
                    socketChannel.configureBlocking(false);
                    System.out.println("客戶端已連接,開始和客戶端交互...");
                }
                for (SocketChannel channel : socketChannels) {
                    ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                    if (channel.read(readBuffer) > 0) {
                        System.out.println("接收到客戶端消息: " + new String(readBuffer.array(), "utf-8").trim());
                        readBuffer.clear();
                    }

                    if (ready) {
                        ByteBuffer writeBuffer = ByteBuffer.wrap(bytes);
                        channel.write(writeBuffer);
                        writeBuffer.clear();
                    }
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 改良:
     * 1、支持一個(gè)客戶端對(duì)多個(gè)服務(wù)端 (服務(wù)端發(fā)送消息,客戶端都能收到,所有客戶端發(fā)送消息服務(wù)端都能收到)
     * 2、相對(duì)與server3多線程方式,服務(wù)端只需要啟動(dòng)一個(gè)主線程即可與所有客戶端交互,
     * 缺點(diǎn):
     * 1、cpu空轉(zhuǎn)
     * 2、未使用selector多路復(fù)用器,其編程其實(shí)還是類似與BIO形式(服務(wù)端還是每個(gè)線程對(duì)應(yīng)一個(gè)客戶端)
     */
    static final List<SocketChannel> socketChannels4 = new CopyOnWriteArrayList<>();
    private static void server4() {
        try (
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        ) {
            serverSocketChannel.socket().bind(new InetSocketAddress(9999));
            serverSocketChannel.configureBlocking(false);
            //accept設(shè)置了非阻塞,因此需要放置在循環(huán)中使用,否則程序直接結(jié)束了
            while (true) {
                SocketChannel socketChannel = serverSocketChannel.accept();
                if (socketChannel != null) {
                    System.out.println("客戶端已連接,開始和客戶端交互...");
                    socketChannel.configureBlocking(false);
                    socketChannels4.add(socketChannel);
                }
                Iterator<SocketChannel> iterator = socketChannels4.iterator();
                boolean ready = consoleReader.ready();
                byte[] writeBytes = null;
                if (ready) {
                    writeBytes = consoleReader.readLine().getBytes();
                }

                while (iterator.hasNext()) {
                    ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                    SocketChannel channel = iterator.next();
                    if (channel.read(readBuffer) > 0) {
                        System.out.println("接收到客戶端消息: " + new String(readBuffer.array(), "utf-8").trim());
                        readBuffer.clear();
                    }

                    if (ready) {
                        ByteBuffer writeBuffer = ByteBuffer.wrap(writeBytes);
                        channel.write(writeBuffer);
                        writeBuffer.clear();
                    }
                }
                Thread.sleep(1000);
            }
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 改良:
     * 1、支持一個(gè)客戶端對(duì)多個(gè)服務(wù)端 (服務(wù)端發(fā)送消息,客戶端都能收到,所有客戶端發(fā)送消息服務(wù)端都能收到)
     * 2、相對(duì)與server3多線程方式,服務(wù)端只需要啟動(dòng)一個(gè)主線程即可與所有客戶端交互,
     * 缺點(diǎn):
     * 1、cpu空轉(zhuǎn)
     * 2、未使用selector多路復(fù)用器,其編程其實(shí)還是類似與BIO形式(服務(wù)端還是每個(gè)線程對(duì)應(yīng)一個(gè)客戶端)
     */
    private static void server5() {

        try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
             Selector selector = Selector.open();
             BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        ) {
            serverSocketChannel.socket().bind(new InetSocketAddress(9999));
            serverSocketChannel.configureBlocking(false);
            //將serverSocketChannel注冊(cè)到selector, 并監(jiān)聽accept事件
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
            List<SocketChannel> socketChannels = new ArrayList<>();
            while (true) {
                //非阻塞
                selector.select(1000);
                Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
                while (iterator.hasNext()) {
                    SelectionKey selectionKey = iterator.next();
                    if(selectionKey.isAcceptable()) {
                        SocketChannel socketChannel = serverSocketChannel.accept();
                        System.out.println("客戶端已連接,開始和客戶端交互...");
                        socketChannel.configureBlocking(false);
                        socketChannel.register(selector, SelectionKey.OP_READ);
                        socketChannels.add(socketChannel);
                    } else if(selectionKey.isReadable()) {
                        SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
                        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                        if (socketChannel.read(readBuffer) > 0) {
                            System.out.println("接收到客戶端消息: " + new String(readBuffer.array(), "utf-8").trim());
                            readBuffer.clear();
                        }
                    }
                    iterator.remove();
                }

                if(consoleReader.ready()) {
                    byte[] bytes = consoleReader.readLine().getBytes();
                    for (SocketChannel socketChannel : socketChannels) {
                        ByteBuffer writeBuffer = ByteBuffer.wrap(bytes);
                        socketChannel.write(writeBuffer);
                        writeBuffer.clear();
                    }
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

NIO Client

public class SocketClient {

    public static void main(String[] args) {
        //client1();
        //client2_3_4();
        client5();
    }

    private static void client1() {

        try (
            SocketChannel socketChannel = SocketChannel.open();
        ){
            socketChannel.configureBlocking(false);
            socketChannel.connect(new InetSocketAddress("127.0.0.1", 9999));
            while (!socketChannel.finishConnect()) {
                Thread.sleep(1000);
                System.out.println("正在連接客戶端...");
            }

            ByteBuffer writeBuffer = ByteBuffer.wrap("向服務(wù)端發(fā)送消息".getBytes());
            socketChannel.write(writeBuffer);
            writeBuffer.clear();

            ByteBuffer readBuffer = ByteBuffer.allocate(1024);
            while (true) {
                if(socketChannel.read(readBuffer) > 0) {
                    System.out.println("接收到服務(wù)端消息: " + new String(readBuffer.array(), "utf-8").trim());
                    readBuffer.clear();
                    break;
                }
                Thread.sleep(1000);
            }

        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


    private static void client2_3_4() {
        try (
            SocketChannel socketChannel = SocketChannel.open();
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        ){
            socketChannel.configureBlocking(false);
            socketChannel.connect(new InetSocketAddress("127.0.0.1", 9999));
            while (!socketChannel.finishConnect()) {
                Thread.sleep(1000);
                System.out.println("正在連接客戶端...");
            }

            ByteBuffer readBuffer = ByteBuffer.allocate(1024);
            while (true) {
                if(socketChannel.read(readBuffer) > 0) {
                    System.out.println("接收到服務(wù)端消息: " + new String(readBuffer.array(), "utf-8").trim());
                    readBuffer.clear();
                }

                if (consoleReader.ready()) {
                    ByteBuffer writeBuffer = ByteBuffer.wrap(consoleReader.readLine().getBytes());
                    socketChannel.write(writeBuffer);
                    writeBuffer.clear();
                }
                Thread.sleep(1000);
            }
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    private static void client5() {
        try (
            SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9999));
            Selector selector = Selector.open();
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        ){
            socketChannel.configureBlocking(false);
            socketChannel.register(selector, SelectionKey.OP_READ);
            while (true) {
                selector.select(1000);
                Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
                while (iterator.hasNext()) {
                    SelectionKey selectionKey = iterator.next();
                    if (selectionKey.isReadable()) {
                        SocketChannel channel = (SocketChannel) selectionKey.channel();
                        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                        if(channel.read(readBuffer) > 0) {
                            System.out.println("接收到服務(wù)端消息: " + new String(readBuffer.array(), "utf-8").trim());
                            readBuffer.clear();
                        }
                    }
                    iterator.remove();
                }
                if (consoleReader.ready()){
                    ByteBuffer writeBuffer = ByteBuffer.wrap(consoleReader.readLine().getBytes());
                    socketChannel.write(writeBuffer);
                    writeBuffer.clear();
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

文章來源地址http://www.zghlxwxcb.cn/news/detail-774150.html

到了這里,關(guān)于IO/NIO交互模擬及漸進(jìn)式實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis-漸進(jìn)式遍歷scan的使用

    Redis-漸進(jìn)式遍歷scan的使用

    目錄 1、為什么使用漸進(jìn)式遍歷? 2、scan的使用 3、漸進(jìn)式遍歷的缺點(diǎn) 4、補(bǔ)充知識(shí)點(diǎn):redis中也區(qū)分database? ? ? ? ? 前面的博客中,我們有提到使用keys *來獲取所有的key,但這種辦法,當(dāng)Redis中存儲(chǔ)的有很多key時(shí),實(shí)行此命令所耗費(fèi)的時(shí)長就會(huì)很長,不符合使用規(guī)范,redis一

    2024年02月07日
    瀏覽(27)
  • 寫點(diǎn)東西《漸進(jìn)式網(wǎng)絡(luò)應(yīng)用入門》

    PWA 是一種漸進(jìn)式網(wǎng)絡(luò)應(yīng)用程序,它結(jié)合了應(yīng)用程序的功能和網(wǎng)絡(luò)技術(shù)。 您可以說它們是使用網(wǎng)絡(luò)技術(shù)構(gòu)建的應(yīng)用程序,但感覺和功能都像原生應(yīng)用程序。 網(wǎng)絡(luò)應(yīng)用程序似乎變得有限,因?yàn)榇蠖鄶?shù)人更喜歡構(gòu)建移動(dòng)應(yīng)用程序,以便用戶可以將它們保存在手機(jī)上,而不是構(gòu)建網(wǎng)

    2024年01月19日
    瀏覽(25)
  • Vue3 Flask 漸進(jìn)式入門筆記

    以下均在Windows 10環(huán)境下實(shí)現(xiàn)。 安裝node.js的過程略過。 1、在cmd命令行中執(zhí)行以下命令: 2、查看vue版本 注意,如果電腦中以前有vue2版本,則需要卸載后重啟電腦再重新安裝,否則有可能安裝失敗。 1、執(zhí)行以下命令以創(chuàng)建項(xiàng)目 第一步需要填寫項(xiàng)目名稱;后面的除router建議選

    2024年02月09日
    瀏覽(17)
  • Unity教程||Unity 漸進(jìn)式光照貼圖烘焙詳解

    隨著各大計(jì)算平臺(tái)的算力穩(wěn)步增長,特別是GPU技術(shù)的不斷進(jìn)化,原先可望而不可及的技術(shù)比如實(shí)時(shí)光線追蹤技術(shù)開始逐步走入玩家的視野。一些先鋒廠商甚至已經(jīng)超出Demo的范疇,開始正式推出支持實(shí)時(shí)光追的游戲。 不過目前的實(shí)時(shí)光追技術(shù)還只能在配備了最新Nvidia RTX 20系列

    2024年02月08日
    瀏覽(43)
  • 【GitOps系列】如何實(shí)施自動(dòng)化漸進(jìn)式交付?

    【GitOps系列】如何實(shí)施自動(dòng)化漸進(jìn)式交付?

    前言 在實(shí)施金絲雀發(fā)布的過程中,我們通過 Argo Rollout 的金絲雀策略將發(fā)布過程分成了 3 個(gè)階段,每個(gè)階段金絲雀的流量比例都不同,經(jīng)過一段時(shí)間之后,金絲雀環(huán)境變成了新的生產(chǎn)環(huán)境。實(shí)際上,這也是一種漸進(jìn)式的交付方式,它通過延長發(fā)布時(shí)間來保護(hù)生產(chǎn)環(huán)境,降低了

    2024年02月14日
    瀏覽(27)
  • 漸進(jìn)式編程之旅:探尋PHP函數(shù)的奇妙世界

    漸進(jìn)式編程之旅:探尋PHP函數(shù)的奇妙世界

    目錄 前言 一、函數(shù)的定義和調(diào)用 1.1?初識(shí)函數(shù) 1.1.1?函數(shù)分類 1.1.2 自定義函數(shù) 1.1.3?return 1.2 參數(shù)設(shè)置 1.2.1 無參函數(shù) 1.2.2?按值傳遞參數(shù) 1.2.3?引用傳參 1.2.4?設(shè)置參數(shù)默認(rèn)值 1.2.5?指定參數(shù)類型(弱) 1.3 變量的作用域 1.3.1 變量分類 1.3.2?全局變量的使用 1.3.3?global關(guān)鍵

    2024年02月08日
    瀏覽(21)
  • 漸進(jìn)式web全棧:blazor web app

    漸進(jìn)式web全棧:blazor web app

    本文要說的這種開發(fā)模式,這種模式并不是只有blazor支持,js中有一樣的方案next.js nuxt.js;blazor還有很多其它內(nèi)容,本文近關(guān)注漸進(jìn)式開發(fā)模式。 是的,前后端是主流,不過以下情況也許前后端分離并不是最好的選擇: 小公司,人員不多,利潤不高,創(chuàng)業(yè)階段能省則省 個(gè)人

    2024年02月05日
    瀏覽(17)
  • 2023-06-17:說一說redis中漸進(jìn)式rehash?

    2023-06-17:說一說redis中漸進(jìn)式rehash?

    2023-06-17:說一說redis中漸進(jìn)式rehash? 答案2023-06-17: 在Redis中,如果哈希表的數(shù)組一直保持不變,就會(huì)增加哈希沖突的可能性,從而降低檢索效率。為了解決這個(gè)問題,Redis會(huì)對(duì)數(shù)組進(jìn)行擴(kuò)容,通常是將數(shù)組大小擴(kuò)大為原來的兩倍。然而,這個(gè)擴(kuò)容過程會(huì)引起元素在哈希桶中的

    2024年02月09日
    瀏覽(27)
  • Vue.js:構(gòu)建用戶界面的漸進(jìn)式框架

    Vue.js是一種流行的JavaScript前端框架,用于構(gòu)建用戶界面。本文將介紹Vue.js的基本概念、特點(diǎn)、應(yīng)用場景以及與其他框架的對(duì)比。 一、引言 在當(dāng)今的前端開發(fā)領(lǐng)域,Vue.js已經(jīng)成為了一個(gè)備受矚目的框架。它的簡潔、靈活和易于上手的特性使得開發(fā)人員能夠快速高效地構(gòu)建用戶

    2024年01月23日
    瀏覽(28)
  • redis到底是怎么樣進(jìn)行漸進(jìn)式Rehash的

    redis到底是怎么樣進(jìn)行漸進(jìn)式Rehash的

    Redis 是一個(gè)開源(BSD許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件。那么redis的底層是如何來存儲(chǔ)數(shù)據(jù)的呢? 一、redis如何在存儲(chǔ)大量的key時(shí)候,查詢速度還能接近O(1)呢? 查詢速度接近O(1)的數(shù)據(jù)結(jié)構(gòu)通常讓我們想到的就是HashMap結(jié)構(gòu),那下面

    2024年02月09日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包