c# BeginSend / BeginReceive 未接收相同数量的数据

c# BeginSend / BeginReceive not receiving the same amount of data

提问人:Gabriel Jefferson 提问时间:9/12/2022 更新时间:9/12/2022 访问量:49

问:

我正在尝试使用 C# 中的异步套接字编写聊天应用程序。 我面临的问题是,当客户端运行命令列出登录服务器的用户时,服务器应将列表发送给客户端,然后客户端将更新列表。 问题是客户端没有从服务器接收全部数据。 然后,当将数据转换为已处理数据的形式(即字符串)时,它不能,并且就像数据为 null 一样。

当服务器收到“List”命令时,它会发回带有消息的“List”命令。
服务器代码的片段:

case Data.Command.List:

                    //Send the names of all users in the chat room to the new user
                    msgToSend.cmdCommand = Data.Command.List;
                    msgToSend.strMessage = null;
                    msgToSend.strName = null;

                    //Collect the names of the user in the chat room
                    foreach (Cliente client in clientes)
                    {
                        //To keep things simple we use asterisk as the marker to separate the user names
                        msgToSend.strMessage += client.strName + "*";
                    }
                    // DEBUG: The server is setting the message correctly
                    Console.WriteLine(msgToSend.cmdCommand);
                    Console.WriteLine(msgToSend.strMessage);
                    Console.WriteLine(msgToSend.strName);

                    message = msgToSend.ToByte();

                    // DBEUG: Printing on the screen the array of data that is being sent to the client.
                    foreach (var item in message)
                    {
                        Console.WriteLine(item);
                    }

                    //Send the name of the users in the chat room
                    clientSocket.BeginSend(message, 0, message.Length, SocketFlags.None,
                            new AsyncCallback(OnSend), clientSocket);
                    break;
            }

当我检查服务器发送的数据和客户端接收的数据时,数组是不同的。

我上次
运行服务器的示例: 3 0 0 0 0 0 0 0 9 0 0 0 77 101 117 85 115 101 114 49 42

客户: 3 0 0 0 8 0 0 0 0 0 0 0 77 101 117 85 115 101 114 49

将 Data 转换为字符串的类的一部分:

public Data(byte[] data)
{
    //The first four bytes are for the Command
    this.cmdCommand = (Command)BitConverter.ToInt32(data, 0);

    //The next four store the length of the name
    int nameLen = BitConverter.ToInt32(data, 4);

    //The next four store the length of the message
    int msgLen = BitConverter.ToInt32(data, 8);

    //This check makes sure that strName has been passed in the array of bytes
    if (nameLen > 0)
        this.strName = Encoding.UTF8.GetString(data, 12, nameLen);
    else
        this.strName = null;

    //This checks for a null message field
    if (msgLen > 0)
        this.strMessage = Encoding.UTF8.GetString(data, 12 + nameLen, msgLen);
    else
        this.strMessage = null;
}

我不知道为什么客户端接收的数据少于服务器发送的数据。 有什么帮助吗?

C# 套接字异

评论

2赞 Damien_The_Unbeliever 9/12/2022
假设是 TCP 而不是 UDP,这完全是意料之中的。TCP 是无穷无尽的字节流,而不是消息。如果要将“消息”从服务器发送到客户端,则由您实现某种形式的框架(长度前缀、分隔符、固定大小等)以允许接收方构造消息。否则,如果仅依赖 TCP 的保证,则只能保证每次成功调用 时至少会收到一个字节。Receive
0赞 Charlieface 9/12/2022
您使用裸套接字,而不仅仅是使用像 HTTP 这样的适当协议有什么原因吗?此外,您应该使用 ,而不是更复杂的asyncawaitBeginEnd
0赞 Gabriel Jefferson 9/12/2022
我不知道如何实现 async await 和 xxxxasync 方法。找不到一个简单的文档。

答: 暂无答案