【问题标题】:Java TCP Server send more messages in one flushJava TCP Server 一次性发送更多消息
【发布时间】:2013-01-01 17:17:29
【问题描述】:

使用此代码:

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~ 条消息,我希望它们分开。

【问题讨论】:

    标签: java tcpclient tcpserver tcpsocket


    【解决方案1】:

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

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

    我希望它们分开。

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多