套接字发送客户端列表
本文关键字:列表 客户端 套接字 | 更新日期: 2023-09-27 17:49:52
我不是很精通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)通过套接字进入?
来自套接字。接收方法文档:
如果您正在使用面向连接的套接字,则Receive方法将读取尽可能多的数据,不超过缓冲区的大小。
因此,即使服务器一次发送五条消息,它们都存储在客户端的输入缓冲区中并立即读取。
您看到的是设计。这就是TCP的工作原理。或者正如其他人会告诉您的那样,"TCP是一个流协议,而不是消息协议。"
简短的总结:仅仅因为你"发送"了N个字节,并不意味着你将"收到"N个字节。TCP将独立于应用程序如何构建其"发送"调用来传输字节。您的接收端代码应该准备好处理所有不同大小的接收字节块,而不一定是等于您的应用程序消息大小的块