小耶稣 2022-05-03 23:43 采纳率: 0%
浏览 34

我这里有段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上下浮动,结果都一样。

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

  • 写回答

1条回答 默认 最新

  • 拾光师 2022-05-04 10:16
    关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 5月3日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题