套接字发送客户端列表

时间:2012-12-30 11:49:48

标签: c# winforms sockets

我对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用户。 我怎么解决这个问题? 否则,我可以通过套接字发送我的Object(UserList)吗?

2 个答案:

答案 0 :(得分:1)

来自Socket.Receive Method文档:

  

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

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

答案 1 :(得分:0)

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

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