我正在尝试使用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上?
答案 0 :(得分:0)
您不知道服务器正在发送什么,但您正在使用尝试逐行读取的字符串阅读器。请注意,“线”在不同系统上的定义不同。在Windows中,一行由“\ r \ n”终止,在MacOS上,它由“\ r”或“\ n”终止,具体取决于版本。尝试逐字节读取,并首先识别数据包终结符。
另外,正如here所述,仅依靠ready()
是不够的。如果数据可用,它将返回true(但该数据可能不会被上面提到的行终止符终止,因此readLine()
仍然会阻塞)。如果ready()
返回false,则表示服务器已完成发送数据。
如果仍然无法帮助您,外部网络工具(例如Wireshark)对于调试网络代码非常有用。如果您确实认为存在错误,请确保您拥有与系统无关的代码,并且您可以通过在自己的最小服务器上进行监听来重新产生问题。