【问题标题】:c# sockets missing datac#sockets丢失数据
【发布时间】:2011-06-16 05:56:52
【问题描述】:

我有以下代码来读取从服务器发送到客户端的消息:

while (true) {
    byte[] readBuffer = new byte[327680];
    StringBuilder message = new StringBuilder(327680);
    while (true) {
        do {
            int bytes = ServerStream.Read(readBuffer, 0, readBuffer.Length);
            message.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer, 0, bytes));
        }
        while (ServerStream.DataAvailable);

        if (message.Length > 0) {
            foreach (string msg in message.ToString().Split(MESSAGE_END)) {
                if (msg != "") ProcessServerMessage(msg);
            }
            message.Clear();
            readBuffer = new byte[327680];
        }
    }
}    

不幸的是......变量“消息”似乎时不时地被切断,我无法理解。我已经使读取缓冲区变得很大,看看这是否是问题所在,但这没有帮助。当服务器一次发送大量数据,但远不及 327680 字节时,似乎会发生这种情况......

此外,在检查服务器日志时,它似乎正在完整地发送数据,未截断。这就像一半的信息在互联网上的某个地方“丢失”了......但这是 TCP,所以这不应该发生,对吧?

提前致谢

【问题讨论】:

  • 有什么理由不能使用WCF?即使您的服务器端代码位于消息中间,也有很多事情在幕后发生,可能会使.DataAvailable 属性为假。 WCF 将为您简化所有这一切以及更多。
  • 现在改变游戏已经太晚了,不幸的是......我不知道WCF。 :
  • 这可能值得您花时间。它易于使用,有很多示例,并且可能会为您省去很多麻烦。不过只是一个建议。否则按照 Chris 的建议去做。

标签: c# sockets


【解决方案1】:

它没有丢失,您没有正确进行缓冲读取。即使您正在检查DataAvailable,也有可能发件人尚未刷新该数据。所以它“在路上”(等待发送),但DataAvailable 将返回 false,因为它还没有到达。

最好在数据之前发送一个整数,以便接收者知道需要多少数据,或者寻找某种终止符(null、换行符等)。

【讨论】:

  • 不要忘记添加某种超时机制,这样如果服务器确实无法发送消息的结尾,线程就不会被锁定。
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多