Java 与套接字关联的输入流正在返回字节值为0的数据
我使用Java套接字(TCP,读取超时设置为30秒)与外部第三方服务器通信。 服务器数据是由特定于应用的分组组成的连续流 但从过去几天开始,输入流将返回表示字节值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
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感谢您的感谢,但再次让我困惑的是,为什么人们在这里问问题,而他们不打算尝试给出的答案。