示例#1
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;
        }