2010-11-24 79 views
3

我有一個Java套接字服務器和連接套接字工作得很好。我需要幫助的是將響應傳回客戶端。我得到了輸出流socket.getOutputStream()。我該如何做到這一點,以便在寫入輸出流時立即發送,但將來可以在同一連接上發送另一塊數據。在Java套接字流式響應

我想簡單地結合使用writewriteflush,但我真的不知道我在做什麼...

回答

2

flush()會強制將數據發送到操作系統。操作系統可以緩衝數據,客戶端上的操作系統也可以緩衝。如果您希望操作系統提前發送數據,我建議您嘗試關閉Nagle的算法。 socket.setTcpNoDelay(真);但是,您會發現OS /驅動程序參數仍然可以引入一些緩衝/數據包coelesing。

如果你看看Sun的JDK 6 java.net.SocketOutputStream,你會看到flush()方法什麼也不做。在所有平臺上都不能保證這種情況,並且可能需要flush()。

+0

謝謝!把Nagle的算法關閉了! – 2010-11-24 17:52:53

3

根據本地實現,插座可以有一個緩衝,而不是發送字節秒你打電話write()。然而,flush()會強制發送字節。通常情況下,發送較大的數據塊而不是逐字節數據流是一種很好的做法(對於流式傳輸,通常先在接收端建立一個緩衝區)。最佳的網絡使用可能是發送儘可能大的數據包(受MTU限制)。要在java中擁有本地緩衝區,請將套接字輸出流包裝在BufferedOutputStream中。

+0

我的最終目標是提供與Twitter類似的流API,所以我需要發送的信息小塊。 – 2010-11-24 17:53:44

1

另一種解決辦法是DataOutputStream
DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
dataOut.writeInt(1)