2

我对 C# 不是很熟练,但我将它用于家庭作业。我创建了一个函数来将连接到服务器的客户端列表发送给其他客户端

private void SendListToClients()
    {
        Socket userSocket=null;
        string username = null;
        string role = null;
        foreach (User Users in UserList)
        {
            userSocket = Users.getSocket();
            username = Users.getUsername();
            role = Users.getRole();
            userSocket.Send(Encoding.ASCII.GetBytes("!ListStart\n"));
            for(int i=0;i<UserList.Count;i++)
            {
                User UsersControl = (User)UserList[i];
                string roleU = UsersControl.getRole();
                string usernameU = UsersControl.getUsername();

                userSocket.Send(Encoding.ASCII.GetBytes("!ClientList:"+usernameU + ":" + roleU+"\n"));       
            }

        }
    }

我的问题出在 userSocket.Send() 行中,当我在客户端收到此消息时,我没有收到(例如,如果列表中的用户是 5 个)5 个发送,但 1 个与所有 5 个用户一起发送。我该如何解决这个问题?否则有可能通过套接字直接发送我的对象(UserList)吗?

4

2 回答 2

1

Socket.Receive 方法文档:

如果您使用的是面向连接的 Socket,则 Receive 方法将读取尽可能多的数据,直到缓冲区的大小。

因此,即使服务器一次发送 5 条消息,它们都存储在客户端的输入缓冲区中并立即读取。

于 2012-12-30T12:33:09.920 回答
0

您所看到的是设计使然。这就是 TCP 的工作原理。或者正如其他人会告诉你的那样,“TCP 是流协议,而不是消息协议。”

简短摘要:仅仅因为您“发送”了 N 个字节,并不意味着您将“接收”N 个字节。TCP 将独立于应用程序如何构建其“发送”调用来流式传输字节。您的接收端代码应该准备好处理所有不同大小的接收字节块,并且不一定在等于您的应用程序消息大小的块中

于 2012-12-30T12:44:36.910 回答