0

所以我一直在编写一个多客户端服务器应用程序时遇到了一些实际问题。经过大量的摆弄后,我意识到虽然我定位在 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);
}

一些当我运行应用程序时,一切都按预期运行,循环并打印here1..2..3的不断重复列表。在服务器端这里1..2..3。其次是大家好,150。但是突然在一两秒后(有时更少,有时更多 - 这是非常不一致的)服务器在here2之后阻塞,所以它似乎正在等待read()接收信息. 但是在客户端,您可以看到所有内容都正常发送,客户端正在等待此处3。

我根本不明白这一点,尤其是不一致。如果我将 pout.println() 替换为 out.write(),并将 bin.readLine() 替换为 in.read(),则永远不会发生此问题,并且这两个程序将永远循环,就像没人管一样。我真的很想知道为什么会这样!

4

1 回答 1

0

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

于 2013-09-15T09:49:55.773 回答