2013-01-01 18 views
3

使用此代碼發送更多的信息:Java的TCP服務器在一個沖洗

Java服務器端:

... 
out = new PrintWriter(this.client.getOutputStream(), true); 
... 
public void sendMsg(String msg) { 
    out.println(msg); 
    //out.flush(); // we don't flush manually because there is auto flush true 
} 

C#客戶端:

while(connected) { 
     int lData = myStream.Read(myBuffer, 0, client.ReceiveBufferSize); 
     String myString = Encoding.UTF8.GetString(myBuffer); 
     myString = myString.Substring(0, lData); 
     myString = myString.Substring(0, myString.Length-2); 
     addToQueue(myString); 
    } 

mystring變量中有很多郵件時,服務器應像

hello \r\t hello \r\t ... 

他們應該分開來像

hello \r\t 
hello \r\t ... 

這意味着當我等待他們一個個都瞬間所有的人都在排,我怎麼能使其在不同的沖洗發送一個接一個。

注意我在一秒鐘內發送30條信息(1秒),我希望它們分開。

回答

2

TCP支持一個字節流。這意味着無論您如何發送數據,您都無法控制數據到達的方式。 (除了它會以字節爲單位)如果你依賴它以任何特定的方式進行,你應該重新考慮你的協議。

您可以減少數據聚集的數量,但所有這些都會以吞吐量爲代價減少延遲,不應該依賴於此數據。這可以通過關閉Nagle並減少TCP驅動程序中的共享設置來降低(但不是消除),如果您可以更改這些設置。

我希望它們分開。

你可以想要它,但TCP不支持你想要的消息。


在你的情況下的解決方案是讓你的讀者匹配你的作家協議。您發送線路以便您一次讀取線路,例如BufferedReader.readLine(),而不是任何數據碰巧在緩衝區中的塊。