2017-08-04 149 views
0

我试图用inputStream.available()连续读取tcp套接字上的数据字节计数。如果它返回的值大于0,则使用inputStream.read(byte[inputstream.available()] b)从TCP读取数据。但如果我们用[PSH,ACK](在Wireshark中)接收到数据,它只会返回计数。当只有数据[ACK](在wireshark中)时,它每次都返回0,直到没有收到带有[PSH,ACK]的数据。它仅在服务器需要发送大量数据时才会发生(不了解服务器实现)。延迟读取TCP套接字数据

这里是代码片段:

while(inputStream.available()>0){ 
    byte [] bytesFromServer=new byte[inputStream.available()] 
    inputStream.read(bytesFromServer); 
} 

的问题是: - 1.我可以读出的数据,而不用担心[PSH,ACK]或数据[ACK]标记。 2.为什么数据需要从服务器获取[PSH,ACK]标志。

回答

2

我想连续读取使用inputStream.available().

这是你的第一个错误的TCP套接字。 InputStream.available()不读取数据:它仅提供估计值有多少数据可用于读取而没有阻塞。如果您尝试连续阅读,则完全不需要available()。只需调用read()方法之一,最好是采用(大)字节数组的方法。

如果我们用[PSH,ACK](在Wireshark中)接收到数据,它只会返回计数。当只有数据[ACK](在wireshark中)时,它每次都返回0,直到没有收到带有[PSH,ACK]的数据。它仅在服务器需要发送大量数据时才会发生(不了解服务器实现)。

什么available()返回并不重要。听到你的平台实际上实现了PSH标志是令人惊讶的,但是不管你是否应该阻止在read()。任何其他策略都没有意义。

问题是: 1.我可以读取数据而不用担心数据中的[PSH,ACK]或[ACK]标志。

是的。

  1. 为什么数据从服务器获取[PSH,ACK]标记的时间。

不知道,但它是无关紧要的。

while(inputStream.available()>0){ 
    byte [] bytesFromServer=new byte[inputStream.available()] 
    inputStream.read(bytesFromServer); 
} 

除了每次读取两个系统调用,此代码驱动垃圾收集狂乱,并不读取到流结束。试试这个:

byte [] bytesFromServer=new byte[8192]; // or double or quadruple if you like 
int count; 
while ((count = inputStream.read(buffer)) > 0) { 
    // do something with buffer[0..count-1] 
} 
+0

我认为,inputStream.available()将读取TCP套接字,并重新提供可用于读取的套接字上的字节数。在这里,我试图连续读取可用字节数,使用此方法是数据/或字节数大于0,而不是我试图使用read()或read(byte [inputstream.available()]读取数据)。 –

+0

我是TCP网络的新手。我的观察是,只有在java中有[PSH,ACK]的数据才来到套接字.available方法将返回计数,否则它只返回0。所以如果可用()计数为零,我不会读取数据,因为我不知道需要读取的字节大小。 –

+0

我按照注释编辑了问题 –