コード例 #1
0
ファイル: SocketServer.cs プロジェクト: praybb/LgwAppFrame
        /// <summary>
        /// 当客户端连接之后要处理的一个线程,会验证客户端的身份。成功才允许登陆;
        /// </summary>
        /// <param name="stateOne1">TcpState</param>
        private void loginInitialization(object stateOne1)
        {
            TcpTransmitBox stateOne = (TcpTransmitBox)stateOne1;

            if (ClientNumber >= _clientMax)
            {
                EngineLog("客户端数量已达到上限!");//记录
                socketRemove(stateOne, "客户端数量已达到上限");
                return;
            }
            Send(stateOne, EncDecVerification.EncryptionVerification(CipherCode._serverToClient));//发送登录成功的代码
            try
            {
                stateOne.WorkSocket.BeginReceive(stateOne.Buffer, 0, stateOne.Buffer.Length, 0, new AsyncCallback(ReadCallback), stateOne);
            }
            catch
            {
            }
            DateTime dateOne = DateTime.Now;

            while (true)//如果2秒中之内客户端没有根据登录信息回复,将自动关闭这个客户端
            {
                Thread.Sleep(100);
                if (stateOne == null || stateOne.ConnectOk == true)
                {
                    break;
                }
                if ((int)(DateTime.Now - dateOne).TotalSeconds > 2)
                {
                    clientClose(stateOne); EngineLog(stateOne.IpEndPoint.ToString() + "无法收到客户端登录信息");//记录;
                    break;
                }
            }
        }
コード例 #2
0
ファイル: SocketServer.cs プロジェクト: praybb/LgwAppFrame
 /// <summary>
 /// 心跳线程
 /// </summary>
 private void heartThread()
 {
     while (true)
     {
         Thread.Sleep(HeartTime * 1000);
         int i = 0;
         while (i < state.Count)
         {
             if (state[i] == null)
             {
                 state.RemoveAt(i);
                 continue;
             }
             else if ((int)(DateTime.Now - state[i].HeartTime).TotalSeconds > HeartTime * 4)//4次没有收到失去联系
             {
                 socketRemove(state[i], "客户端长期连接不上,将断开此客户端");
                 continue;
             }
             else
             {
                 Send(state[i], EncDecVerification.EncryptionVerification(CipherCode._heartbeatCode));
             }
             i++;
         }
         if (_engineStart == false || state.Count > 100)//后面的大于100用于限制商业版的
         {
             break;
         }
     }
 }
コード例 #3
0
 /// <summary>
 /// 心跳线程
 /// </summary>
 private void heartThread()
 {
     while (true)
     {
         Thread.Sleep(HeartTime * 1000);
         if (stateOne == null)
         {
             continue;
         }
         else if ((int)(DateTime.Now - stateOne.HeartTime).TotalSeconds > HeartTime * 4) //4次没有收到失去联系
         {
             lostClient("客户端长期连接不上服务器根据Reconnection值判断是否重连");                            //当突然断开的时候
             continue;
         }
         else
         {
             Send(stateOne, EncDecVerification.EncryptionVerification(CipherCode._heartbeatCode));
         }
         if (_engineStart == false)
         {
             break;
         }
     }
     HeartThread = null;
 }
コード例 #4
0
        /// <summary>
        /// 登录以及心跳代码进行处理;由基类在操作
        /// </summary>
        /// <param name="stateOne">TcpState</param>
        /// <param name="haveDate">byte</param>
        override internal void VerificationCodeManage(TcpTransmitBox stateOne, byte haveDate)
        {
            if (stateOne == null)
            {
                return;
            }
            switch (haveDate)
            {
            case 0:    //不是需要的数据
                break;

            case CipherCode._heartbeatCode:    //是心跳信息
                //stateOne.HeartTime = DateTime.Now;
                break;

            case CipherCode._serverToClient:    //客户端和服务端暗号正确;已登录;
                Send(stateOne, EncDecVerification.EncryptionVerification(CipherCode._clientToServer));
                //启用心跳进程
                loginSuccess();
                break;

            case CipherCode._clientCloseCode:    //服务器要求客户端关掉;
                CloseEngine();
                break;
            }
        }
コード例 #5
0
ファイル: SocketServer.cs プロジェクト: praybb/LgwAppFrame
 /// <summary>
 /// 发送代码的形式服务器强制关闭一个客户端
 /// </summary>
 /// <param name="stateOne">TcpState</param>
 private void clientClose(TcpTransmitBox stateOne)
 {
     if (stateOne == null || ClientNumber == 0)
     {
         return;
     }
     state.Remove(stateOne);                                                                 //先把这个移除,万一对方没有收到下面的信息;对方一定时候也会自动关闭这个连接
     Send(stateOne, EncDecVerification.EncryptionVerification(CipherCode._clientCloseCode)); //发送一个强制关闭的代码过去
 }
コード例 #6
0
 /// <summary>
 /// 数据按分类进行处理(数据第二次处理)
 /// </summary>
 /// <param name="stateOne">传输用的盒子</param>
 /// <param name="statecode">收到的数据</param>
 internal void CategorizeData(TcpTransmitBox stateOne, DataModel statecode)
 {
     if (statecode == null || stateOne == null)
     {
         return;
     }
     //说明是验证类型;抛给验证暗号处理中心,如果不是抛给普通数据处理
     if (statecode.State == CipherCode._verificationCode)
     {
         byte haveDate = EncDecVerification.DecryptVerification(statecode.DateByte);
         VerificationCodeManage(stateOne, haveDate);
     }
     else
     {
         codeManage(stateOne, statecode);
     }
 }