java网络通信:伪异步I/O编程(PIO)

Posted 打败大魔王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java网络通信:伪异步I/O编程(PIO)相关的知识,希望对你有一定的参考价值。

缺点:避免了线程资源耗尽的问题,但是根本上来说,serversocket的accept方法和inputstream的输入流方法都是阻塞型方法。

服务端:加了一个线程池,实现线程复用。客户端不变

public class TimeServer {
    public static void main(String[] args) throws IOException {
        int port = 8080;
        ServerSocket server = null;
        try {
            server = new ServerSocket(port);
            System.out.println("The time server is start in port : " + port);
            Socket socket = null;
TimeServerHandlerExecutePool singleExecutor = new TimeServerHandlerExecutePool(50, 10000);// 创建IO任务线程池
            while (true) {
                socket = server.accept();
                singleExecutor.execute(new TimeServerHandler(socket));
            }
        } finally {
            if (server != null) {
                System.out.println("The time server close");
                server.close();
                server = null;
            }
        }
    }
}

public class TimeServerHandlerExecutePool {
    private ExecutorService executor;
    public TimeServerHandlerExecutePool(int maxPoolSize, int queueSize) {
        executor = new ThreadPoolExecutor(Runtime.getRuntime()
                .availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<java.lang.Runnable>(queueSize));
    }
    public void execute(java.lang.Runnable task) {
        executor.execute(task);
    }
}

客户端:

public class TimeClient {
    public static void main(String[] args) {
        int port = 8080;
        Socket socket = null;
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            socket = new Socket("127.0.0.1", port);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
            out.println("QUERY TIME ORDER");//发送请求
            System.out.println("Send order 2 server succeed.");
            String resp = in.readLine();//回复
            System.out.println("Now is : " + resp);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (this.socket != null) {
                try {
                    this.socket.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                this.socket = null;
            }
        }
    }
}

 

以上是关于java网络通信:伪异步I/O编程(PIO)的主要内容,如果未能解决你的问题,请参考以下文章

同步阻塞通信-伪异步I/O编程

Java IO编程全解——伪异步IO编程

MicroPython RP2040可编程IOs(PIO)示例介绍

02-伪异步I/O通讯模型

linux 网络编程 ---高级I/O

linux 网络编程 ---高级I/O