2012-12-30 59 views
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)通过套接字输入?

+0

您使用的是什么协议,是TCP? –

+0

是的,我使用Tcp – Francesco

回答

1

Socket.Receive Method文档:

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

因此,即使服务器每次发送一封一封五封邮件,所有这些邮件都存储在客户端的输入缓冲区中并立即读取。

+0

好的,谢谢你的帮助。你可以建议我以某种方式分割结果,因为我想追加连接到ListView小部件中的所有客户端。 – Francesco

+0

分割结果最简单的方法是定义一个固定的消息长度,比如128个字节,并且只发送很长的消息。然后,在客户端上使用相同大小的缓冲区来接收消息。 –

+0

你能告诉我一个例子吗? – Francesco

0

你看到的是设计。这是TCP的工作原理。或者像别人会告诉你的,“TCP是一种流协议,而不是消息协议。”

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

相关问题