0

有人可以向我解释为什么在注释掉 in.available()>0 的情况下这很好用,但是当我把它放回去时它会中断?

mySocket = new Socket("blahblah", 12345);
BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream());
....
char result[] = new char[length];       
for (int i = 0; i < length && !mySocket.isClosed() /*&& in.available()>0*/; i++){
    result[i] = (char)in.read();
}

更具体地说:我正在制作一个 Android 应用程序,用户可以在其中搜索一个术语,该搜索被发送到空间中的某个东西,我以 xml 形式返回结果,并用它们做一些事情。当我返回的 xml 足够小(参见上面代码中的“长度”)时,代码在 in.available()>0 的情况下工作得很好。但如果长度很大,in.available() 返回 0。但是随着注释掉,一切都会继续顺利进行。

这是为什么?这是我需要担心和解决的问题吗?

4

2 回答 2

2

in.available() 让您知道您是否可以在那一刻读取数据而不会阻塞。由于 Socket 有数据流,它可能不会立即可用,但会在很短的时间内可用。例如,如果您有一个 1 Gbit 连接,完整的数据包将不会接近 15 微秒,这对于计算机来说是很长的时间。

于 2012-07-13T15:46:45.450 回答
1

我认为数据很大时 in.available() == 0 的原因是因为它还没有机会将其写入您的套接字。您不需要使用 in.available()。另外,我不建议一次读取一个字符,因为有大量数据并且在网络上非常健谈,这会非常慢。考虑读取大小为“length”的字节数组。

于 2012-07-13T15:47:09.977 回答