黑马程序员技术交流社区

标题: socket通信服务端实时删除掉线的客户端问题 [打印本页]

作者: 戴伟    时间: 2012-7-4 08:56
标题: socket通信服务端实时删除掉线的客户端问题
  1. 服务端这里对客户端连接做了try...catch处理,但是无法有效地除掉已经掉线的客户端
  2. private void button2_Click(object sender, EventArgs e)
  3. {
  4. button2.Enabled = false;
  5. byte[] btMsg = System.Text.Encoding.UTF8.GetBytes("OpenDoor");

  6. if (dict.Count < 1)
  7. {
  8. PlaySoundNobody();
  9. return;
  10. }

  11. //遍历所有的客户端,给每个客户端发送客人到访消息
  12. foreach (Socket sock in dict.Values)
  13. {
  14. try
  15. {
  16. sock.Send(btMsg);
  17. }
  18. catch (SocketException ex)
  19. {
  20. dict.Remove(sock.LocalEndPoint.ToString());
  21. lbContent.Items.Add(ex.Message);
  22. }
  23. }

  24. //用独立的线程播放音频文件
  25. Thread thread = new Thread(PlaySound);
  26. thread.IsBackground = true;
  27. thread.Start();
  28. }
复制代码

作者: 许庭洲    时间: 2012-7-4 09:11
把除掉已经掉线的客户端处理模块放到finaly{  }试试看:
try
  {
       //给每个客户端发送客人到访消息
  }
  catch (SqlException e2)
  {
    ......
  }
  finaly
  {
     //除掉已经掉线的客户端
   dict.Remove(sock.LocalEndPoint.ToString());
   lbContent.Items.Add(ex.Message);
  }
作者: 王玲星    时间: 2012-7-5 01:15
这位锅锅是想完整的实现QQ么?  求指导~~~  {:soso_e196:}
作者: 戴伟    时间: 2012-7-5 09:36
搞定了,foreach内部不能修改被循环的集合对象,在foreach外面加了个arraylist,把sock.RemotEndPoint.ToString()添加进去,然后再根据arraylist删除掉线的sock
王星玲,我的一个项目在做socket,我想实现自动重连的功能,这个是我碰到的一个问题,呵呵




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2