接收的过程代码如下:
public  void CommuniteHelp_TCP()
        {
            while (TCPOpenFlag)
            {
                try
                {
                    MREvent.Reset();
                    tcpListener.BeginAcceptTcpClient(new AsyncCallback(AsynAccept),tcpListener);
                    MREvent.WaitOne();
                }
                catch (Exception ex)
                {
                    TCPOpenFlag = false;
                }
           }           
        }
       /// <summary>
        /// 异步接收
        /// </summary>
        /// <param name="mtcplisten"></param>
        private void AsynAccept(IAsyncResult mtcplisten)
        {
            TcpListener mtcpListener = (TcpListener)mtcplisten.AsyncState;
            TcpClient mtcpClient = mtcpListener.EndAcceptTcpClient(mtcplisten);
            MREvent.Set();
            ThreadAsynReceiveData(mtcpClient);                      
        }
  private byte[] receiveBytes = new byte[1024];
        /// <summary>
        /// 新线程异步接收
        /// </summary>
        /// <param name="mobj"></param>
        private void ThreadAsynReceiveData(object mobj)
        {            TcpClient mtcpClient = mobj as TcpClient;
            if (null != mtcpClient)
            {
                mtcpClient.Client.BeginReceive(receiveBytes, 0, 1024, SocketFlags.None, new AsyncCallback(doneAsynAccept), mtcpClient);//mtcpClient                
            }        }        /// <summary>
        /// 处理异步接收
        /// </summary>
        /// <param name="iar"></param>
        private void doneAsynAccept(IAsyncResult iar)
        {
            try
            {
                lock (lockobj)
                {
                    TcpClient mtcpClient = (TcpClient)iar.AsyncState;
                    int dataCount = mtcpClient.Client.EndReceive(iar);
                    if (dataCount > 0)
                    {
                        IAsyncResult Result = mtcpClient.Client.BeginReceive(receiveBytes, 0, 1024, SocketFlags.None, new AsyncCallback(doneAsynAccept), mtcpClient);//mtcpClient
                        
                        string asciistr = System.Text.ASCIIEncoding.ASCII.GetString(receiveBytes, 0, dataCount);
                        StructModel.tcpSendTo tcpsendto = new StructModel.tcpSendTo();
                        tcpsendto.point = ((IPEndPoint)mtcpClient.Client.RemoteEndPoint);
                        tcpsendto.oreceiveBytes = receiveBytes;
                        tcpsendto.receiveBytesLength = (ushort)dataCount;
                        tcpsendto.ns = mtcpClient.GetStream();
                        tcpsendto.tcpClient = mtcpClient;
                        DoWork(tcpsendto);
                        //Thread _thread = new Thread(new ParameterizedThreadStart(DoWork));
                        //_thread.IsBackground = true;
                        //_thread.Start(tcpsendto);
                        //lock (RTU80SWSD_MainView.WaitHandleYDM)
                        //{
                        //    RTU80SWSD_MainView.WaitHandleTCP.Enqueue(tcpsendto);
                        //}
                        //RTU80SWSD_MainView.YDMsignal.Set();
                        Thread.Sleep(200);
                    }
                    else
                    {
                        mtcpClient.Client.Shutdown(SocketShutdown.Both);
                        mtcpClient.Client.Close();
                    }
                }
            }
            catch
            {
            }        }在doneAsynAccept函数中                 string asciistr = System.Text.ASCIIEncoding.ASCII.GetString(receiveBytes, 0, dataCount);
接收到的数据经常是相同的,请问是什么原因

解决方案 »

  1.   

     socket接收数据 跟你的网速也有一定的关系 如果网速不好 很容易丢包的
      

  2.   

    楼上的都误解了我的意思,我用一个测试工具给Socket 服务并发数据 ,一次可能同时发1000条不一样的数据,但我的socket接收到的却是很多条一样的数据。
      

  3.   

    确实是粘包 导致的,可以参考一下ESFramework通信框架的做法
      

  4.   

    把MREvent.Set(); 移到第4个函数doneAsynAccept的int dataCount = mtcpClient.Client.EndReceive(iar);
    下时,接收到的包和发送的包正常,但增加tcpclient客户端连接切不行,分析是程序在MREvent.WaitOne 停住了,这可能就是异步接收中采集MREvent.Set 同步导致的。现在想问该怎么改进这种问题
      

  5.   

    将read内容先存在buffer里,然后每次read后扫buffer看是否存在一个完整的包,可能一次read后buffer中的包不完整就等下次,也可能存在一次read后buffer中有多个包,tcp已经确保了不会丢包,只存在socket断开