Java-第十七部分-NIO和Netty-BIO

158 阅读1分钟

NIO和Netty全文

BIO

image.png

  • blocking IO,同步阻塞,一个链接一个线程,通过线程池连接,实现多个客户连接服务器,实现并发
  • 编程流程
  1. 服务器端启动
  2. 客户端启动,对服务器进行连接,默认情况下服务器需要对每个客户建立一个线程,与其通信
  3. 客户端发出请求后,先咨询服务器是否有线程响应,如果没有,则等待,或者被拒绝
  4. 如果有响应,客户端线程会等待请求结束后,继续执行
  • curl发送字符串 curl -d dwads 127.0.0.1:6666
  • 安装telnet brew install telnet

control+] 进入telnet客户端

public void Server() throws IOException {
    //创建线程池
    ExecutorService es = Executors.newCachedThreadPool();
    ServerSocket ss = new ServerSocket(6666);
    System.out.println("服务器启动");
    while(true) {
        //监听
        final Socket socket = ss.accept();
        System.out.println("连接到一个客户端");
        //创建线程
        es.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread());
                handler(socket);
            }
        });
    }
}
//客户端通信
public static void handler(Socket socket) {
    byte[] bytes = new byte[1024];
    InputStream is = null;
    try {
        is = socket.getInputStream();
        //读取,阻塞
        int read = is.read(bytes);
        while (read != -1) {
            System.out.println(new String(bytes, 0, read));
            read = is.read(bytes);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //关闭
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

问题

  • 每个请求都需要创建独立的线程,与对应的客户端进行数据交互
  • 并发数较大时,需要创建大量的线程来处理连接,系统资源占用大
  • 建立连接后,如果无数据可读,就会阻塞到read上,造成线程资源浪费