3

我正在尝试使用 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;
         }
    }

我还尝试了 BufferedReader 中的 ready() 或 Scanner 中的 hasNextLine() ,但没有任何用处。

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

4

1 回答 1

0

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

另外,正如这里所解释的,仅仅依靠ready()是不够的。如果数据可用,它将返回 true (但该数据可能不会被上述行终止符终止,因此readLine()仍会阻塞)。如果ready()返回false,不代表服务器发送完数据。

如果这仍然对您没有帮助,那么外部网络工具(例如Wireshark)对于调试网络代码非常有用。如果你真的认为有bug,请确保你有独立于系统的代码,你可以通过在你自己的最小服务器上监听来重现问题。

于 2013-10-27T22:14:12.157 回答