使用此代码:
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~ 条消息,我希望它们分开。
最佳答案
TCP 支持字节流。这意味着无论您如何发送数据,您都无法控制数据如何到达。 (除了它会以字节形式出现)如果你依赖它以任何特定方式出现,你应该重新考虑你的协议(protocol)。
您可以减少数据聚束的数量,但所有这些所做的只是以吞吐量为代价来减少延迟,切勿依赖。如果可以更改这些设置,可以通过关闭 Nagle 并减少 TCP 驱动程序中的协同设置来减少(但不能消除)。
i want them separate.
您可以想要它,但 TCP 不支持您想要的消息。
你的解决方案是让你的读者匹配你的作者协议(protocol)。您发送行,因此您应该一次读取行,例如BufferedReader.readLine(),而不是缓冲区中恰好包含的任何数据 block 。
关于Java TCP 服务器一次发送更多消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14112479/