2009-08-24 56 views
3

我有一個客戶端連接到我的服務器。客戶端發送一些消息給我不關心的服務器,如果我不打算使用它們,不想浪費時間解析它的消息。我使用的所有I/O都是簡單的Java I/O,而不是nio。Java:忽略輸入流 - 會緩衝區溢出併發生不好的事情嗎?

如果我創建輸入流並且從不讀取它,那麼這個緩衝區是否會填滿並導致問題?如果是這樣,有什麼我可以做的或我可以設置的一個屬性,它只是扔掉它看到的數據?

現在如果服務器根本沒有創建輸入流呢?這會在客戶端/發送端造成任何問題嗎?

請讓我知道。

感謝, JBU

+0

只有一個問題:在分析它們之前,你怎麼知道你不應該關心的消息? – ATorras 2009-08-24 16:39:32

回答

2

如果從客戶端得到任何有用的數據,什麼是允許它連接的點?

+0

因爲我需要發送它的數據,當然。 – jbu 2009-08-24 17:34:55

+4

這是爲什麼被投票?這甚至不是答案。 – jbu 2009-08-24 17:38:07

1

我不確定永遠不會從Java中的緩衝區讀取的影響 - 我想最終操作系統將停止接受該套接字上的數據,但我不確定那裏。

爲什麼不直接撥打the skip method of your InputStream大數目,確保丟棄數據?

+0

#skip()幾乎不被所有可能的InputStreams支持,因爲它沒有被強制執行,因此它是一個不能被依賴的機制。 – Esko 2009-08-24 16:58:04

0

我想你得到的InputStream一旦你接受請求,所以如果你不承認該請求的基本框架(即tomcat的)會丟棄請求(一些經過時間後)。

問候。

5

當你從客戶端連接一個accept時,你會得到一個InputStream。如果您未從該流讀取數據,則客戶端的數據將緩衝。最終,緩衝區將被填滿,客戶端在嘗試寫入更多數據時會阻塞。如果客戶在從服務器讀取響應之前寫入其所有數據,那麼最終會出現一個非常典型的死鎖情況。如果您真的不關心來自客戶端的數據,只需閱讀(或致電skip),直到EOF並丟棄數據。或者,如果它不是一個標準的請求/響應(如HTTP)協議,則啓動一個新的線程,該線程會不斷讀取流以避免備份。

+1

+1建議創建一個線程來讀取/丟棄不需要的數據。這是最簡單可靠的解決方案;即它可以避免真正的客戶端線程阻塞,同時等待不需要的數據出現。 – 2009-08-24 23:11:37

0
InputStream in = .... 
byte[] buffer = new byte[4096] // or whatever 
while(true) 
    in.read(buffer); 

如果您接受連接,則應讀取數據。告訴你我從未見過(或可能預見到)這種情況(忽略所有數據的服務器)可能有用的情況。