• 【从NIO到Netty】1.BIO存在的问题


    package org.scaventz.bio;
    
    import io.netty.util.CharsetUtil;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.*;
    
    public class BioEchoServer {
    
        private ServerSocket serverSocket;
        private final int PORT = 8080;
    
        private ExecutorService exec = new ThreadPoolExecutor(10, 20, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(50));
    
        public void init() throws IOException {
            serverSocket = new ServerSocket();
            serverSocket.bind(new InetSocketAddress(PORT));
        }
    
        public void startup() throws IOException {
    
            while (true) {
                System.out.println("等待连接");
                Socket socket = serverSocket.accept();
                System.out.println("与 " + socket.getInetAddress() + " 建立连接");
                exec.execute(new Thread(() -> {
                    InputStream inputStream = null;
                    OutputStream outputStream = null;
                    try {
                        inputStream = socket.getInputStream();
                        outputStream = socket.getOutputStream();
                        TimeUnit.SECONDS.sleep(2);
                        byte[] bytes = new byte[inputStream.available()];
                        inputStream.read(bytes);
                        System.out.println("[客户端-" + socket.getRemoteSocketAddress() + "]: " + new String(bytes, CharsetUtil.UTF_8));
                        outputStream.write(bytes);
                    } catch (InterruptedException | IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }));
            }
        }
    
        public static void main(String[] args) throws IOException {
            BioEchoServer server = new BioEchoServer();
            server.init();
            server.startup();
        }
    }

    上面是一段BIO模式的Server端代码

    这段代码存在的性能问题:

    1. 红色部分,线程会被阻塞
    2. 每个连接,都分配给一个单独的线程进行处理

    下一节【从BIO到Netty】2.NIO 概述我们来看看 NIO 解决这些问题的思路  

  • 相关阅读:
    scanf与scanf_s的区别
    PAT 1041 考试座位号
    PAT1018 锤子剪刀布
    Cookie
    JSP--原理
    多线程练习题
    Java线程--线程的同步与锁
    有关toString()和println(Object)
    Java Web请求和响应机制
    IO流
  • 原文地址:https://www.cnblogs.com/heben/p/13174361.html
Copyright © 2020-2023  润新知