2013-08-19 44 views
0

我正在使用Java套接字在兩臺機器之間進行通信。 所以當服務器收到一條消息時,它會處理它並用另一條消息回覆。 我正在使用TCP協議。當數據實際上通過套接字發送?

我的問題是,假設網絡很慢。然後在發送消息之後立即發送消息,如果我調用套接字的InputStream.available()方法,我會從服務器獲取實際可用字節到套接字嗎?

也是InputStream.available()總是返回從服務器發送的字節的全部數量,即使消息是非常大的?我聽說TCP有一個數據包限制,所以會影響InputStream.available()嗎?

+0

你試過了嗎? – Undo

+0

不,我不能模擬繁忙的網絡,我不知道這種情況何時會發生。另外我編輯了這個問題來問一個相關的問題。 – Harikrishnan

+0

我假設你的意思是'InputStream.available()'而不是'Socket.available()',因爲Java Socket API中沒有這樣的方法。這是正確的,還是你正在使用一些第三方庫? –

回答

1

幾乎不會有從服務器立即可用的字節(客戶端應用程序可以比任何網絡都可以傳輸數據並且服務器可以處理和發送響應的速度更快地檢查輸入流FAR)。

不,您不能保證非零的available()調用將返回服務器響應的整個大小。從的Javadoc引用:

返回可以從該輸入流不被下一 調用的方法的此輸入阻斷stream.The下一個被讀取(或 跳過)的字節數的估計值調用可能是 是相同的線程或另一個線程。單個讀或跳過這個多個字節不會被阻塞,但可以讀取或跳過較少的字節。

請注意,雖然InputStream的某些實現將返回流中的總字節數 ,但許多實現不會。從來沒有 正確使用此方法的返回值來分配旨在保存此流中的所有數據的緩衝區 。

+0

謝謝您的回覆。那麼確保信息完成的另一種方法是什麼? – Harikrishnan

+1

這取決於您實現與服務器進行通信的協議。簡單的做法是讓服務器在消息的開頭髮送一個內容長度,以便知道需要讀取的字節數。 – Aurand

+0

非常感謝您的澄清。 – Harikrishnan

1

服務器發送數據到流並且客戶端收到它之間總會有一個延遲。根據網絡速度的不同,可能會更長或更短。此外,如果消息大小大於TCP數據包最大大小,則消息將被拆分爲多個TCP數據包,在這種情況下,available()可能會返回小於消息大小的值。

+0

非常感謝您的澄清。 – Harikrishnan