A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

3 个回复

倒序浏览
把除掉已经掉线的客户端处理模块放到finaly{  }试试看:
try
  {
       //给每个客户端发送客人到访消息
  }
  catch (SqlException e2)
  {
    ......
  }
  finaly
  {
     //除掉已经掉线的客户端
   dict.Remove(sock.LocalEndPoint.ToString());
   lbContent.Items.Add(ex.Message);
  }

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
这位锅锅是想完整的实现QQ么?  求指导~~~  {:soso_e196:}
回复 使用道具 举报
搞定了,foreach内部不能修改被循环的集合对象,在foreach外面加了个arraylist,把sock.RemotEndPoint.ToString()添加进去,然后再根据arraylist删除掉线的sock
王星玲,我的一个项目在做socket,我想实现自动重连的功能,这个是我碰到的一个问题,呵呵

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马