JavaBIO模型

BIO编程

BIO编程简单流程

  1. 服务器端启动一个ServerSocket
  2. 客户端启动socket,对服务器进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通信
  3. 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或则被拒绝
  4. 如果有响应,客户端线程会等待请求结束后才继续执行

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
0%