java BufferedReader适用于Windows而不是mac

时间:2013-10-27 21:47:53

标签: java windows macos sockets bufferedreader

我正在尝试使用BufferedReader或Scanner从服务器读取输出,但它会卡在read()或readLine()对象上。它永远不会从那条线回来。但是,它完全适用于Windows。 读取输出的代码如下所示:

while ((serverResponce = this.in.readLine()) != null) {
            if (serverResponce.compareTo(message) == 0) {
                break;
            }
        }

或使用Scanner类:

Scanner scanner = new Scanner(socket.getInputStream());
    while (scanner.hasNextLine())
    {
        serverResponce = scanner.nextLine();

        if (serverResponce.compareTo(message) == 0) {
              break;
         }
    }

我还尝试在ScanfferedReader中的ready()或者在Scanner中使用hasNextLine()但没有任何用处。

我对服务器的输出没有任何控制权,所以我不知道他们使用的是哪种格式。它在Mac上使用telnet但不在java应用程序中。是什么原因导致它在Windows上运行但却被卡在Mac OS X上?

1 个答案:

答案 0 :(得分:0)

您不知道服务器正在发送什么,但您正在使用尝试逐行读取的字符串阅读器。请注意,“线”在不同系统上的定义不同。在Windows中,一行由“\ r \ n”终止,在MacOS上,它由“\ r”或“\ n”终止,具体取决于版本。尝试逐字节读取,并首先识别数据包终结符。

另外,正如here所述,仅依靠ready()是不够的。如果数据可用,它将返回true(但该数据可能不会被上面提到的行终止符终止,因此readLine()仍然会阻塞)。如果ready()返回false,则表示服务器已完成发送数据。

如果仍然无法帮助您,外部网络工具(例如Wireshark)对于调试网络代码非常有用。如果您确实认为存在错误,请确保您拥有与系统无关的代码,并且您可以通过在自己的最小服务器上进行监听来重新产生问题。