Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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 与套接字关联的输入流正在返回字节值为0的数据_Java_Sockets_Tcp_Client Server_Inputstream - Fatal编程技术网

Java 与套接字关联的输入流正在返回字节值为0的数据

Java 与套接字关联的输入流正在返回字节值为0的数据,java,sockets,tcp,client-server,inputstream,Java,Sockets,Tcp,Client Server,Inputstream,我使用Java套接字(TCP,读取超时设置为30秒)与外部第三方服务器通信。 服务器数据是由特定于应用的分组组成的连续流 但从过去几天开始,输入流将返回表示字节值0的数据 while (connectionIsValid){ final byte[] buffer= new byte[2]; in.read( buffer); //Print buffer //Log line Byte[0] is 0 Byte[1] is 0 //POST processing if bu

我使用Java套接字(TCP,读取超时设置为30秒)与外部第三方服务器通信。 服务器数据是由特定于应用的分组组成的连续流

但从过去几天开始,输入流将返回表示字节值0的数据

 while (connectionIsValid){
 final byte[] buffer= new byte[2];
 in.read( buffer);
  //Print buffer
 //Log line
 Byte[0] is 0 
 Byte[1] is 0

//POST processing if buffer bytes is not equal to OK.
//Other wise bypass post processing
}
-没有记录异常。由于没有生成流/套接字相关的异常,我知道java客户端套接字没有关闭/超时

应用程序在while循环中进行裁剪

[更新]

    private byte[] readWrapper(InputStream stream, int totalLen ) throws IOException {
        byte[] buffer;
        byte[] bufferingBuffer = new byte[0];
        while ( totalLen != 0 ) {
            buffer = new byte[totalLen];
            final int read = stream.read( buffer );
            if(read==-1 || read==0){ 
              //throw exception
             } 
            totalLen = totalLen - read;
            buffer = ArrayUtils.subarray( buffer, 0, read );
            bufferingBuffer = ArrayUtils.addAll( bufferingBuffer, buffer );

        }
        return bufferingBuffer;
    }

你不需要这些。JDK已经包含了一个方法:

private byte[] readChunkedData(InputStream stream, int size) throws IOException {
    byte[] buffer = new byte[size];
    DataInputStream din = new DataInputStream(stream);
    din.readFully(buffer);
    return buffer;
}

此版本(a)有效(b)不需要第三方类,并且(c)如果流中没有
大小
字节,则抛出
EOFEException

您忽略了
read()
返回的值。因此,您得出的关于缓冲区内容的任何结论都是无效的。是的,我应该检查/记录read()返回的值。但是,由于我已将读取时间设置为30秒以外,read()是否会阻塞30秒,直到读取2个字节?这是假设实际读取了2个字节的思想过程。不,它将阻塞,直到(a)至少传输了一个字节,(b)流结束,或者(c)抛出异常。这在Javadoc中都有明确的说明。没有任何东西表明它将尝试填充缓冲区。好的。但是案例(a)适用于我的场景。作为建立套接字后的应用程序,通过读取10个初始字节进行前提条件检查,然后进入while循环。因此,通过套接字传输的字节数超过一个。这完全是不真实的。它可以是案例(a),它至少是一个字节,而不是“超过一个字节”,或者案例(b),它意味着零字节。使用此代码,您不可能知道哪个或多少。修复代码。我见过这个方法,但是如果我想记录每个read()的返回值,如果这个值是read,那么这篇文章和Alvin的评论暗示,即使read()返回0,也有可能在以后的迭代中获取数据。[link]@Alvin对此完全错了。
InputStream.read()
的Javdoc清楚地表明,它会阻塞,直到至少一个字节被传输或流结束或出现异常为止。它可以返回零的唯一方法是提供零长度的缓冲区或计数,这将是一个编程错误。我已经给了你工作代码。当您尝试时会发生什么情况?-在这种情况下,我将按照建议使用DataInputStream作为输入流包装器。感谢您继续讨论。@blueSky感谢您的感谢,但再次让我困惑的是,为什么人们在这里问问题,而他们不打算尝试给出的答案。