JavaBIO模型
          目录
          
        
        
      BIO编程
BIO编程简单流程
- 服务器端启动一个ServerSocket
- 客户端启动socket,对服务器进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通信
- 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或则被拒绝
- 如果有响应,客户端线程会等待请求结束后才继续执行
BioServer
public class BioServer {
    public static void main(String[] args) throws IOException {
        // 1. 创建一个线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(12,
                12,
                10,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(32));
        // 2. 创建一个 ServerSocket
        ServerSocket serverSocket = new ServerSocket(8008);
        // 3. 循环监听客户端连接
        while (true){
            Socket socket = serverSocket.accept();
            System.out.println("新连接加入");
            // 线程池处理请求
            threadPoolExecutor.execute(()-> {
                try {
                    handle(socket);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }
    private static void handle(Socket socket) throws Exception {
        // 定义一个byte数组,接收数据
        byte[] bytes = new byte[1024];
        InputStream inputStream = socket.getInputStream();
        // 循环读取客户端的数据
        while(true){
            int read = inputStream.read(bytes);
            if(read != -1){
                System.out.println(new String(bytes, 0, read));
            }else{
                break;
            }
        }
    }
}BioClient
public class BioClient {
    public static void main(String[] args) {
        String host = "127.0.0.1";
        int port = 8008;
        String exit = "q";
        Socket socket = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try{
            //建立socket连接
            socket = new Socket(host, port);
            //获取输入字符流
            bufferedReader = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()
            ));
            //获取输出字符流
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream()
            ));
            //获取输入字符流
            BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                String msg = scan.readLine();
                //向服务器发送消息
                bufferedWriter.write(msg + "\n");
                bufferedWriter.flush();
                //接收消息
//                String line = bufferedReader.readLine();
//                System.out.println("server:" + line);
                if (msg.equals(exit)) {
                    break;
                }
            }
        }catch (Exception e){
        }finally {
            try{
                if(socket != null){
                    socket.close();
                }
                if(bufferedReader != null){
                    bufferedReader.close();
                }
                if(bufferedWriter != null){
                    bufferedWriter.close();
                }
            }catch (Exception e){
                System.out.println("关闭异常:" + e.getMessage());
            }
        }
    }
}测试:
在客户端控制台输入字符在server端可以看见:
hello bio新连接加入
hello bio