2017-08-04 150 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

我按照註釋編輯了問題 –