• 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;
                }
            }
        }
    }
  • 相关阅读:
    unomi漏洞复现
    xxl-job漏洞复现
    cgi漏洞复现
    celery漏洞复现
    bash漏洞复现
    学习ASP.NET的一些学习资源
    用EF DataBase First做一个简单的MVC3报名页面
    怎样在Word中插入代码并保持代码原始样式不变
    安装notepad++之后怎样在鼠标右键上加上Edit with notepad++
    安装Visual Studio 2010之后怎样安装MSDN Library
  • 原文地址:https://www.cnblogs.com/nazhizq/p/6538687.html
Copyright © 2020-2023  润新知