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); } }
///// <summary> ///// 同步发送方法 ///// </summary> ///// <param name="e"></param> ///// <param name="timeout">同步发送的延迟毫秒</param> //public void Send(AsyncUserToken e, byte[] data) //{ // AsyncUserToken userToken = e; // try // { // //if (!userToken.ConnectSocket.Connected) // //{ // // OffLineClientSocket(userToken); // //} // userToken.ConnectSocket.SendTimeout = 0; // //int startTickCount = Environment.TickCount; // try // { // userToken.ConnectSocket.Send(data, data.Length, SocketFlags.None); // } // catch (SocketException ex) // { // if ( // ex.SocketErrorCode == SocketError.WouldBlock // || ex.SocketErrorCode == SocketError.IOPending // || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable // ) // { // // socket buffer is probably full, wait and try again // Thread.Sleep(30); // // // Log4Debug("发送失败?"); // } // else // { // OffLineClientSocket(userToken); // /*throw ex;*/ // any serious error occurr // } // } // } // catch (Exception error) // { // Log4Debug("SendError:" + error.Message); // OffLineClientSocket(userToken); // } //} public void Send(AsyncUserToken userToken) { Socket socket = userToken.ConnectSocket; //判断Socket是否存在以及是否掉线 if (socket == null) { if (userToken.userInfo != null) { instance.Log4Debug("玩家掉线:" + userToken.userInfo.Register.name); userToken.userInfo.CurState = RoomActorState.Offline; } return; } else if (!socket.Connected)//发送数据时检测到Socket掉线 { return; } //开始发送 socket.SendTimeout = 10000;//设置发送后判断超时的时长 while (userToken.SendBuffer.Count > 0) { byte[] mix = new byte[userToken.SendBuffer.Count]; lock (userToken.SendBuffer) { Array.Copy(userToken.SendBuffer.ToArray(), 0, mix, 0, userToken.SendBuffer.Count); userToken.ClearSend(); } //int startTickCount = Environment.TickCount; while (mix.Length > 0) { int curIndex = userToken.sendIndex; MessageOperation oper = MessageOperation.FromBytes(curIndex, mix); byte[] buffer = null; buffer = oper.ToBytes(); userToken.sendIndex++; mix = mix.Skip(buffer.Length).ToArray(); string sendIfo = "userToken.sendIndex:" + curIndex + "----"; for (int i = 0; i < buffer.Length; i++) { sendIfo += buffer[i] + ","; } Log4Debug(sendIfo); //byte[] idBuffer = BitConverter.GetBytes(curIndex);// 将 int 转换成字节数组 //byte[] lengthBuffer = new byte[4]; //userToken.sendIndex++; //int dealLength = 0; //if (mix.Length > 1020) //{ // dealLength = 1020; //} //else //{ // dealLength = mix.Length; //} //byte[] buffer = new byte[idBuffer.Length + dealLength]; //Array.Copy(idBuffer, 0, buffer, 0, idBuffer.Length);//4 //Array.Copy(mix, 0, buffer, idBuffer.Length, dealLength);//dealLength //mix = mix.Skip(buffer.Length).ToArray(); //string sendIfo = "userToken.sendIndex:" + curIndex + "----"; //for (int i = 0; i < buffer.Length; i++) //{ // sendIfo += buffer[i] + ","; //} //Log4Debug(sendIfo); // int sent = 0; // how many bytes is already sent do { try { sent += socket.Send(buffer, sent, buffer.Length - sent, SocketFlags.None); } catch (SocketException ex) { Log4Debug("sendError:" + ex.SocketErrorCode); // if (ex.SocketErrorCode == SocketError.WouldBlock || ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { // socket buffer is probably full, wait and try again Thread.Sleep(30); Log4Debug("睡眠30秒后继续发送。"); } else { if (ex.SocketErrorCode == SocketError.ConnectionAborted)//您的主机中的软件中止了一个已建立的连接。 { return; } //throw ex; // any serious error occurr Log4Debug("send错误:" + ex.Message); } } } while (sent < buffer.Length); //Log4Debug("发送用时毫秒:" + (Environment.TickCount - startTickCount)); } } userToken.isDealSend = false; }