将 var client = mainSocket.EndAccept(iar); 的结果保存在方法外部声明的一个 List<...> 集合中。群发消息,你直接对这些 client 执行send就行了。不要去注释掉人家给你写的  client.BeginReceive( ...) 代码。timer 要少用。就算用,整个来说用一个就够了。不要每一个会话都产生一个 timer 。另外你循环 99 次是要干什么呢?完全看不出你的流程设计思路。当你拿到别人的代码,先学别人的程序。自己先不要乱改。虽然你贴了一大通代码,但是一眼就能看出哪些是你抄袭别人的,哪些是你写的。一眼就能看出你的问题。所以不是说抄别人的进行胡乱嫁接就一定会变成你自己的东西。你需要先能够完全接受和理解别人的程序。

解决方案 »

  1.   


    //每隔60秒轮一次所有设备
     for (int i = 0; i < 100; i++)
      {
        client.Send(dataSender);
       //接收客户端的消息
      client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
      }问下你这100是什么....100个客户端???在哪添加的 我怎么没看到?实际上 这个client就是连接的对象..你循环啥的没什么用.而且你也不需要在循环中beginrecevie
    直接把////接收客户端的消息下面的注释打开 把上面的注释了 就行了另外说下.如果要保存"客户端的状态"我们一般都会用一个"集合"来装它我个人习惯这样..
    Dictionary<string, Socket> clientList= new Dictionary<string, Socket>();
    当有客户端连接(BeginAccept)的时候 我就会clientList.Add("192.168.1.115:52358",client);
    掉线的时候 我可以在remove所以 操作的时候 我直接拿clientList负责连 就是连接负责收 就是收..操作交给别人....
      

  2.   

    打字太多果然慢啊...居然沙发没了.不过这次回答难得在统一战线..... var timer = new System.Timers.Timer(); 
                       timer.Interval = 10000D;   
                     timer.Enabled = true;           
             timer.Elapsed += (o, a) =>
     {
      for clientlist.count
         var client=client[i]
         client.send(new byte[] .........)
    };
    正如sp所说的 一个够了...
      

  3.   

    感谢两位大师的指点1.var timer = new System.Timers.Timer(); 
                       timer.Interval = 10000D;   
                     timer.Enabled = true;         
    首先我把这一段代码,拿到BeginAccept外。2.我要把客户端返回的信息,放在list里面3.我要根据客户端返回的不同信息,给客户端返回信息或把数据保存到数据库中。
    (现在第一,第二步,好实现,第三步该如果处理?)
      

  4.   

    如果你只玩文字不玩协议的话 那么你就判断你的 
    var bytemessage = Encoding.ASCII.GetBytes(message);就够了.各种if 各种else 各种insert 各种send..你不会连这些都不会写吧,...我相信你会的.
      

  5.   

    我就在ReceiveMessage里写判断就行了,对吗