c#套接字缺少数据

本文关键字:数据 套接字 | 更新日期: 2023-09-27 17:59:10

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

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,所以这不应该发生,对吧?

提前感谢

c#套接字缺少数据

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

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