Java 为什么我的名字是in.read();仅当定位在bin.readLine()之后时,函数才不一致,即使两者都有一致的输入?

Java 为什么我的名字是in.read();仅当定位在bin.readLine()之后时,函数才不一致,即使两者都有一致的输入?,java,sockets,client-server,inputstream,outputstream,Java,Sockets,Client Server,Inputstream,Outputstream,因此,我在编写一个多客户端服务器应用程序时遇到了一些实际问题。经过大量的修改,我意识到,虽然我在bin.readLine之后放置的in.read()方法通常会收到它的信息,但有时它会挂起,就好像从未发送过信息一样。即使所有信息都以完全相同的方式以相同的顺序发送。为了简化事情,我只编写了一个非常简单的客户机-服务器程序来测试这种情况 客户端和服务器都使用while(true){来持续循环,并且都有System.out.println(here1)或(here2)等,以允许我查看代码中出现意外行为的

因此,我在编写一个多客户端服务器应用程序时遇到了一些实际问题。经过大量的修改,我意识到,虽然我在bin.readLine之后放置的in.read()方法通常会收到它的信息,但有时它会挂起,就好像从未发送过信息一样。即使所有信息都以完全相同的方式以相同的顺序发送。为了简化事情,我只编写了一个非常简单的客户机-服务器程序来测试这种情况

客户端和服务器都使用while(true){来持续循环,并且都有System.out.println(here1)或(here2)等,以允许我查看代码中出现意外行为的地方。因此,这是客户端的while循环。in.read();在循环的底部,只有在服务器的while循环也到达底部之前才会阻塞,这样客户端的循环速度就不会比服务器快

while (true){
    System.out.println("here1");

pout.println("Hello everybody");

    System.out.println("here2");

out.write(150);

    System.out.println("here3");

in.read();
}
这是服务器的while循环

while (true){
    System.out.println("here1");

String a = bin.readLine();

    System.out.println("here2");

int b = in.read();

    System.out.println("here3");

System.out.println(a);
System.out.println(b);

out.write(1);
}
有些时候,当我运行应用程序时,一切都按预期运行,循环并打印一个不断重复的列表1..2..3。在服务器端,这里1..2..3。然后是Hello Everyone,150。然而,在一两秒钟之后(有时更少,有时更多-这非常不一致)服务器在此处2之后阻塞,因此它似乎在等待read()接收信息。但是在客户端,您可以看到一切正常发送,客户端在此处3之后等待


我完全不理解这一点,尤其是不一致性。如果我用out.write()替换pout.println(),用in.read()替换bin.readLine(),这个问题永远不会发生,这两个程序也不会像任何人一样循环。我真的想知道为什么会发生这种情况!

缓冲读取器“bin”正在缓冲您试图通过“in”读取的数据。您不能这样做:您不能混合缓冲和非缓冲,我的数量超过了相同的底层源。

非常感谢您的支持答案。只是在《学习Java》(O'Reilly)一书中,在一个示例中,Inputstream用于创建一个BufferedReader,而程序在.read()和bin.readLine()中都使用了这两种方法.如果不应该将两者混合使用,那么如果希望程序同时接收两行文本和单个字节,正确的方法是什么?不过,我刚刚在书中的示例中注意到,in.read()正好位于bin.readLine()之前当我重新安排上面的代码来复制它时,它可以完美地工作。这是混合它们的正确方法还是仍然很危险?这本书是错误的。这种技术通常不能工作,只有当所有的直接读取都在所有的缓冲读取之前。你需要重新设计你的协议。