Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedInputStream说它不可用,但仍然有效_Java_Sockets_Inputstream_Blocking_Bufferedinputstream - Fatal编程技术网

Java BufferedInputStream说它不可用,但仍然有效

Java BufferedInputStream说它不可用,但仍然有效,java,sockets,inputstream,blocking,bufferedinputstream,Java,Sockets,Inputstream,Blocking,Bufferedinputstream,有人能给我解释一下为什么在in.available()>0被注释掉的情况下这一切都很好,但是当我把它放回时,它就坏了 mySocket = new Socket("blahblah", 12345); BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream()); .... char result[] = new char[length]; for (int i = 0; i < len

有人能给我解释一下为什么在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();
}
mySocket=新套接字(“blahblah”,12345);
BufferedInputStream in=新的BufferedInputStream(mySocket.getInputStream());
....
字符结果[]=新字符[长度];
对于(int i=0;i0*/;i++){
.read()中的结果[i]=(字符);
}
更具体地说:我正在制作一个Android应用程序,用户可以在其中搜索一个术语,该搜索被发送到interspace中的某个东西,我以xml形式返回结果,并对其进行处理。当我返回的xml足够小时(请参见上面代码中的“长度”),如果in.available()>0保留在in中,代码就可以正常工作。但如果长度较大,in.available()将返回0。但随着评论的结束,一切都继续顺利进行


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

in.available()让您知道是否可以在不阻塞的情况下读取数据。由于套接字有一个数据流,它可能不会立即可用,但会在短时间内可用。e、 g.如果您有1 Gbit连接,完整的数据包将不超过15微秒,这对于计算机来说是很长的时间。

in.available()让您知道您是否可以在不阻塞的情况下读取数据。由于套接字有一个数据流,它可能不会立即可用,但会在短时间内可用。e、 g.如果您有一个1 Gbit连接,完整数据包将不超过15微秒,这对于计算机来说是很长的时间。

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

< P>我认为当数据大时,在.Abvabl()= 0的原因是因为它还没有机会将它写入到套接字中。您不需要在.available()中使用。另外,我不建议一次只读取一个字符,这将非常慢,数据量很大,而且在网络上非常健谈。考虑在长度为“长度”的字节数组中进行读取。

您也应该删除ISCOLD()测试。它不会做你想做的事情:它只会告诉你你是否自己关上了插座。这不是EOS测试:返回-1的read()告诉您这一点。如果您自己关闭了套接字,那么首先就不应该接近此代码。您还应该删除isClosed()测试。它不会做你想做的事情:它只会告诉你你是否自己关上了插座。这不是EOS测试:返回-1的read()告诉您这一点。如果您自己关闭了套接字,那么首先就不应该接近此代码。