3

使用此代码:

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

这意味着当我一个接一个地等待时,它们会立即排成一排,我怎样才能让它在单独的冲洗中一个接一个地发送。

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

4

1 回答 1

2

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

您可以减少数据捆绑的数量,但这所做的只是以吞吐量为代价减少延迟,因此永远不应该依赖它。这可以通过关闭 Nagle 并减少 TCP 驱动程序中的 co-alessing 设置来减少(但不能消除),如果您可以更改这些设置。

我要他们分开。

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


您的解决方案是让您的读者与您的作家协议相匹配。您发送行,因此您应该一次读取行,例如 BufferedReader.readLine(),而不是碰巧在缓冲区中的任何数据块。

于 2013-01-01T17:30:34.757 回答