void senddata() { while (true)//永远循环 { try { System.Threading.Thread.Sleep(1000); Datauser[] listsoctemp = new Datauser[listsoc.Count]; listsoc.CopyTo(0, listsoctemp, 0, listsoctemp.Length); //为什么写这两句,是因为多线程中,添加和删除集合的操作,都会对其他线程有影响,所以先 //拷贝一份副本 foreach (Datauser soc in listsoctemp) { try { bool b = true; if (soc != null) { b = SendRoot <DTUDATA>(soc.soc, 0x2, "getdata", DTUALL, 0, soc.token);//把接收到的数据发送给客户端 } if (!b) { listsoc.Remove(soc); } } catch { } } } catch { } } }
/// <summary> /// 这个方法可以获得0XFF的命令,这个命令是保留字,系统把它用来路由通知服务端,客户端谁上线了。 /// </summary> /// <param name="command"></param> /// <param name="data"></param> /// <param name="soc"></param> public override void Runcommand(byte command, string data, Socket soc) { string[] temp = data.Split('|'); if (temp[0] == "in") //in是上线,out是下线 { String Token = temp[1]; //这个就是上线人员的Token了 //我暂时不考虑谁上线的问题,我把只要上线的都推送,做个简单例子。 Datauser du = new Datauser(); du.soc = soc; du.token = Token; listsoc.Add(du); } else if (temp[0] == "out") { String Token = temp[1];//这个就是下线人员的Token了 Datauser[] listsoctemp = new Datauser[listsoc.Count]; listsoc.CopyTo(0, listsoctemp, 0, listsoctemp.Length); //为什么写这两句,是因为多线程中,添加和删除集合的操作,都会对其他线程有影响,所以先 //拷贝一份副本 foreach (Datauser du in listsoctemp) { if (Token == du.token) { listsoc.Remove(du); return; } } } }