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;
             }
         }
     }
 }