延迟读取TCP套接字数据

时间:2017-08-04 06:27:19

标签: java sockets tcp

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

以下是代码段:

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

问题是: - 1.我可以在不担心数据中的[PSH,ACK]或[ACK]标志的情况下读取数据。 2.为什么数据需要时间从服务器获得[PSH,ACK]标志。

1 个答案:

答案 0 :(得分: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]标志。
  2.   

不知道,但这无关紧要。

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]
}
相关问题