private void ReceiveCallback(IAsyncResult ar) { AsyncUserToken userToken = (AsyncUserToken)ar.AsyncState; Socket socket = userToken.ConnectSocket; try { if (socket == null || !socket.Connected) { return; } lock (userToken.ReceiveBuffer) { //从远程设备读取数据 int read = socket.EndReceive(ar); if (read > 0) { //byte[] buffer = new byte[read]; ////将getBuffer数组的前read个字节拷贝到buffer数组中 //Array.Copy(userToken.AsyncReceiveBuffer, 0, buffer, 0, read); //userToken.userInfo.heartbeatTime = DateTime.Now; ////接收数据保存以后继续接收 //ProcessReceive(userToken); //lock (userToken.ReceiveBuffer) //{ // //存值 // for (int i = 0; i < buffer.Length; i++) // { // //将buffer保存到队列 // userToken.ReceiveBuffer.Enqueue(buffer[i]); // } //} //if (!userToken.isDealReceive) //{ // userToken.isDealReceive = true; // Handle(userToken); //} byte[] buffer = new byte[read]; //将getBuffer数组的前read个字节拷贝到buffer数组中 Array.Copy(userToken.AsyncReceiveBuffer, 0, buffer, 0, read); //接收数据保存以后继续接收 ProcessReceive(userToken); string info = ""; for (int i = 0; i < buffer.Length; i++) { info += buffer[i] + ","; } //Log4Debug("接收数据:" + info); MessageOperation oper = MessageOperation.FromBytes(buffer); userToken.outOrders.Add(oper.GetId(), oper.Message); //byte[] intBuff = new byte[4] { buffer[0], buffer[1], buffer[2], buffer[3] }; //int index = BitConverter.ToInt32(intBuff, 0); // 从字节数组转换成 int //byte[] dealBuffer = new byte[buffer.Length - intBuff.Length]; //Array.Copy(buffer, intBuff.Length, dealBuffer, 0, dealBuffer.Length); //userToken.outOrders.Add(index, dealBuffer); //while (userToken.outOrders.ContainsKey(userToken.sendIndex)) //{ // //存值 // for (int i = 0; i < userToken.outOrders[userToken.sendIndex].Length; i++) // { // //将buffer保存到队列 // userToken.ReceiveBuffer.Enqueue(userToken.outOrders[userToken.sendIndex][i]); // } // userToken.sendIndex++; //} if (!userToken.isDealReceive) { userToken.isDealReceive = true; Handle(userToken); } } else//接收数据小于等于0 { CloseClientSocket(userToken); return; } } } catch (Exception error) { Log4Debug("ReceiveError:" + error.Message); CloseClientSocket(userToken); } }