Java TCP Server在一次刷新中发送更多消息

时间:2013-01-01 17:17:29

标签: java tcpclient tcpserver tcpsocket

使用此代码:

Java Server端:

...
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 ...

这意味着当我一个接一个地等待它们时,它们会立即连续出现,我怎么能让它在一个单独的冲洗中逐个发送。

注意我会在一秒内(1秒)连续发送30条消息,我希望它们分开。

1 个答案:

答案 0 :(得分:2)

TCP支持字节流。这意味着无论您如何发送数据,您都无法控制数据的到达方式。 (除了它将以字节形式出现)如果你以任何特定的方式依赖它,你应该重新考虑你的协议。

您可以减少数据的聚合量,但所有这些都是以吞吐量为代价减少延迟,永远不应该依赖。如果您可以更改这些,可以通过关闭Nagle并减少TCP驱动程序中的共同设置来减少(但不能消除)。

  

我希望他们分开。

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


您的解决方案是让您的读者符合您的编写者协议。你发送行,所以你应该一次读取行,例如BufferedReader.readLine(),而不是碰巧在缓冲区中的任何数据的块。