//方法
       void RecvData(IAsyncResult iar)
       {           Socket remote = (Socket)iar.AsyncState;
           try
           {               string receivedData;               receivedData = Encoding.Default.GetString(_recvDataBuffer, 0, _recvDataBuffer.Length);//接收到的来自服务器的数据               _msgManage(receivedData);               remote.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, new AsyncCallback(RecvData), remote);//继续监听来自服务器的数据
           }
           catch (SocketException ex)
           {
               if (ex.ErrorCode == 10054)
               { 
                //没有服务器 服务器强制关闭
                   remote.Shutdown(SocketShutdown.Both);
                   remote.Close();                   //通知表示层
               }
           }
       }
//方法#region 发送数据的方法
 public void sendMsg(string msg)
       {
           byte[] data = Encoding.Default.GetBytes(msg);           ClientSocket.BeginSend(data, 0, data.Length, SocketFlags.None,
               new AsyncCallback(SendDataEnd), ClientSocket);
       }       void SendDataEnd(IAsyncResult iar)
       {
           Socket remote = (Socket)iar.AsyncState;
           int sent = remote.EndSend(iar);
       }
#endregion
监听  和 发送的基本方法是这样写的问题:
第一次如果客户发送的信息 是 “ABCD”
那么接收到的信息是 “ABCD”
第二次发送的信息 如果是“ABCDE”
接收到的信息是 “ABCDE”第三次发送的信息 如果是“ppp”
那么接收到的信息就变成 “pppDE”了第四次发送的信息 如果是“x”
那么接收到的信息就变成 “xppDE”了
每次收到的信息长度都会是 历史发送信息的最长的那个 
信息的 最前部分会得到更新;是不是 _recvDataBuffer 数组需要清空?具体怎么解决呢?
各位大哥帮忙!谢谢了;

解决方案 »

  1.   

    你把_recvDataBuffer 数组清空试试看呀,估计问题就在这
      

  2.   

    接收的时候要按接收的具体收到的字节长度,下面语句有问题:
    receivedData = Encoding.Default.GetString(_recvDataBuffer, 0, _recvDataBuffer.Length);
    参考如下代码:private void EndReceiveDatagram(IAsyncResult iar)
    {
        lock (this)
        {
            try
            {
                int readBytesLength = m_socket.EndReceive(iar);  // 实际的长度
                iar.AsyncWaitHandle.Close();            if (readBytesLength == 0)
                {
                    // 以断开连接
                }
                else  // 正常数据包
                {
                    // 处理接收数据
                }
            }
            catch (Exception err)
            {
                // 处理异常
            }
        }
    }
    笔者有一个Socket框架EMTASS2.1请参考http://blog.csdn.net/hulihui/archive/2008/10/27/3158613.aspx
      

  3.   

    buffer 要清空掉,不然就有这个现象的.
    或根据数据的长度,只取这个长度的数据也可.
    1 array.clear(recvDataBuffer,0,recvDataBuffer.length);2            int i=remote.EndReceive()
                              
                   receivedData = Encoding.Default.GetString(_recvDataBuffer, 0,i);//接收到的来自服务器的数据
      

  4.   

    1 array.clear(recvDataBuffer,0,recvDataBuffer.length); 不好意思,没看到上面这句,有了这句可以解决我上面刚刚说的问题~