我这里有段Java IO的代码,为什么服务端收不到消息,在readline中阻塞了?


public class BioServer {
    public static void main(String[] args) {
        boolean flag = true;
        try {
            ServerSocket serverSocket = new ServerSocket(6666);
            while (flag) {
                Socket socket = serverSocket.accept();
                if (socket != null) {
                    new Thread(() -> {
                        try {
                            InputStream inputStream = socket.getInputStream();
                            OutputStream outputStream = socket.getOutputStream();
                            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream), 10);
                            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream), 10);
                            String line;
                            while ((line = reader.readLine()) != null) {
                                System.out.println(line);
                                writer.write(line + System.lineSeparator());
                                // writer.flush();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }).start();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}




public class BioClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1", 6666);
            OutputStream outputStream = socket.getOutputStream();
            InputStream inputStream = socket.getInputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream), 10);
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            while (true) {
                writer.write("hellowor" + System.lineSeparator());
                // writer.flush();
                String str = reader.readLine();
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

为什么服务端收不到客户端发送的那条消息?我想知道原因的本质在哪里。

客户端中:我的应用缓冲设置的大小为10,写入的数据为10个字符,那么在调用write方法的时候,会发起系统调用,将数据发送到套接字内核发送缓冲区(当然10个字符远远没有超过套接字内核发送缓冲区大小),但是据我了解,如果内核发送缓冲区没有满,但是超过一定的时间,操作系统还是会将数据往底层协议发起调用,最终通过网卡发送到网络中。另外发送的数据是以"\r\n"结尾的10个字符。

服务端中:BufferReader的缓冲大小我设置为10,按行读取数据(readline),但是程序运行到readline,就会被阻塞住。应用程序的缓冲大小在10上下浮动,结果都一样。

没有想明白,希望基本功扎实的同行帮忙解答一下。谢谢!

调用writer.flush()不能收到吗