主要结合两位大侠的回复 1 先添加一个类如下:
C# code
  class DataReceivedArgs : EventArgs
    {
        public string Msg { get; protected set; }        public DataReceivedArgs(string msg)
        {
            Msg = msg;
        }
    }接着,我在tcpsocketlayer.cs里添加如下代码
//  声明
   public event EventHandler<DataReceivedArgs> DataReceived;
   
 // socket 异步接收函数
   public void OnReceivedData(IAsyncResult ar)
        {
            if (!ar.IsCompleted)
            {
                return;
            }
            Socket s = (Socket)ar.AsyncState;
            try
            {
                int size = s.EndReceive(ar);               
                string sss = "";
                if (size > 0)
                {                    
                    for (int i = 0; i < size; i++)
                    {
                        sss += bufferReceive[i].ToString("x2");
                    }
                    //globalTasString = sss;                   
                    //llrpReciveTriger = true;                   
                }
                // 事件驱动
                if (DataReceived != null)
                {
                    DataReceived(this, new DataReceivedArgs(sss));
                }// 将sss 返回给界面层调用                s.BeginReceive(bufferReceive, 0, 1024, SocketFlags.None, new AsyncCallback(OnReceivedData), s);
            }
            catch (SocketException E)
            {
            }
        }
最后就是界面上调用 异步通信了 声明一个委托
  public delegate void EventHandler(object sender, EventArgs e);   private void button3_Click(object sender, EventArgs e)
        {
            ts.sendCommandCode(cmd);            
            ts.DataReceived += new EventHandler<DataReceivedArgs>(Foo);
        }        private void Foo(object sender, DataReceivedArgs e)
        {
            //do someting
            MessageBox.Show(e.Msg);
        } 上面是在两位大侠的指导下,完成,,测试可以
 
 程序运行后,连接
 然后点击一次按钮,发送一串命令
 服务器端,返回一个应答
 
 问题出现在连续发送时
 当第二次,点击按钮,发生命令包时, 服务器端,接受到一次命令
 并发生一次响应(我用的是网络调试助手做服务器端),手动点击发送按钮
 客户端,居然收到了2次响应 当我第三次,点击按钮时
 服务器端,还是受到1次命令包
 同时,也回一次响应
 此时,客户端,收到了3次响应 
 看来还是有点问题呀,,,哪里没处理对呢? 谢谢

解决方案 »

  1.   

       private void button3_Click(object sender, EventArgs e)
            {
                ts.sendCommandCode(cmd);            
                ts.DataReceived += new EventHandler<DataReceivedArgs>(Foo);
            }
    不要每次点击都  += ,你在初始化时,+=一次就行了
    ts.DataReceived += new EventHandler<DataReceivedArgs>(Foo);这句放到外面去,放到界面初始化时
      

  2.   

    在你回答前,我试过了这个方法来
    不行 我是放在form_load里 
      

  3.   


      我是放在form_load里
      真不行  啥也收不到
     不过现在放 界面初始化里OK了
      InitializeComponent(); 
     这个后面就可以了