2011-08-18 55 views
0

我目前通過Java套接字發送大量數據,並且我使用Apache Commons IOUtils庫使用copyLarge方法複製以發送/接收數據。問題是copyLarge會一直讀取,直到輸入流返回-1。我抄在下面複製大量數據時重複使用套接字

while (-1 != (n = input.read(buffer))) { 
    output.write(buffer, 0, n); 
    count += n; 
} 

一個片段,此方法將阻塞,直到關閉套接字,但問題是我希望重用插座附加大量的數據。我看到的替代方法是爲每個要傳輸的數據重新打開一個新的套接字,或者編寫自己的讀取方法來查找流標記的結尾(即換行符)。

我已經寫了這樣的低級套接字代碼已經有一段時間了,但我在這裏錯過了什麼嗎?還是有更簡單的方法來做到這一點?

+0

實際上並不難,請參閱http://download.oracle.com/javase/tutorial/networking/sockets/ –

回答

3

你知道你發送了多少數據嗎?如果是這樣,我基本上是長度前綴的消息。

這是好辦比使用令牌結束流中,並不必擔心逃逸,過閱讀等

乾淨但是,是的,你需要做的事,因爲TCP/IP是基於流的協議。除非你有一些指標,以某種方式,你永遠不知道是否會有更多的來實現即時。

+0

謝謝。我知道數據的長度。我希望使用IOUtils.copyLarge(或類似的東西)來發送它,因爲實現了這樣的樣板代碼,我覺得我不應該再次寫它。你知道任何類似的庫,但允許指定長度嗎? –

+0

@Jeff:我不害怕,但是那個代碼應該很容易適應。 –

+0

同意 - 容易適應,只是希望我不必......哦,好吧,猜我會的。謝謝。 –