示例#1
0
        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);
            }
        }
示例#2
0
        ///// <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;
        }