예제 #1
0
        private void SessionClosed(SessionHandler session)
        {
            string id = (string)session.AppTokens[1];

            this._sessionDictionary.Remove(id);

            if (this._manager_login_c == 0)
            {
                return;
            }

            object[]           arguments = session.AppTokens;
            ConnectionWorkType Worktype  = (ConnectionWorkType)arguments[0];

            if (Worktype == ConnectionWorkType.MAINCON)
            {
                SessionCloseModel model = new SessionCloseModel()
                {
                    Msg = AJaxMsgCommand.S_SESSION_CLOSE,
                    Id  = id
                };
                this.SendMessage(JsonConvert.SerializeObject(model));

                this.PutLogQueue("DEBUG Session Closed id:" + id);
            }
        }
        public override void OnMessage()
        {
            var defineHeadSize = sizeof(int);

            if (ListByteBuffer.Count < defineHeadSize)
            {
                return;
            }

            byte[] lenBytes   = ListByteBuffer.GetRange(0, defineHeadSize).ToArray();
            int    packageLen = BitConverter.ToInt32(lenBytes, 0);

            if (packageLen < 0 || packageLen > ApplicationConfiguartion.Options.MaxPacketSize || packageLen < 25) //数据不合法 或 小于大概ack固定长度
            {
                this.Log(LogOutLevelType.Error, $"Type:{ConnectionWorkType.ToString()} 长度不合法!");
                this.CloseSession();
                return;
            }

            if (packageLen + defineHeadSize > ListByteBuffer.Count)
            {
                return;
            }

            this._ackRetainData = ListByteBuffer.GetRange(defineHeadSize, packageLen).ToArray();
            ListByteBuffer.RemoveRange(0, packageLen + defineHeadSize);

            var longSize    = sizeof(long);
            var packageBody = GZipHelper.Decompress(_ackRetainData, longSize, _ackRetainData.Length - longSize);
            var messageHead = TakeMessageHead(packageBody);

            if (messageHead == ACK_HEAD)
            {
                var ack = PacketSerializeHelper.DeserializePacket <AckPacket>(TakeMessage(packageBody));

                this._accessId = ack.AccessId;

                if (ValidityAccessIdWithKey((ConnectionWorkType)ack.Type, ack.AccessId, ack.AccessKey))
                {
                    this.ApportionTypeHandlerEvent?.Invoke(this, (ConnectionWorkType)ack.Type);
                }
                else
                {
                    if ((ConnectionWorkType)ack.Type == ConnectionWorkType.MainApplicationConnection)
                    {
                        var midData = MessageHelper.CopyMessageHeadTo(MessageHead.MID_ACCESS_KEY_WRONG);
                        this.CurrentSession.SendAsync(midData.BuilderHeadPacket());
                    }
                    this.Log(LogOutLevelType.Debug, $"Type:{((ConnectionWorkType)ack.Type).ToString()} AccessId:{ack.AccessId} 或AccessKey:{ack.AccessKey} 验证失败,登陆不成功!");
                    this.CloseSession();
                }
            }
            else
            {
                this.CloseSession();
                this.Log(LogOutLevelType.Warning, $"未知消息,连接被关闭!");
            }
        }
예제 #3
0
 /// <summary>
 /// 发送确认包
 ///
 /// 作用:连接确认,以便服务端识别这是一个有效的工作连接,type = 中间服务器识别
 /// </summary>
 /// <param name="session"></param>
 public void SendAckPack(TcpSocketSaeaSession session, ConnectionWorkType type)
 {
     byte[] data = MessageHelper.CopyMessageHeadTo(MessageHead.C_GLOBAL_CONNECT,
                                                   new AckPack()
     {
         AccessKey = AppConfiguartion.AccessKey,
         Type      = type
     });
     session.SendAsync(data);
 }
 /// <summary>
 /// 发送确认包
 /// 作用:连接确认,以便服务端识别这是一个有效的工作连接,type = 中间服务器识别 , accessId = 发起创建应用服务请求的主控端标识
 /// </summary>
 /// <param name="session"></param>
 private void SendAckPack(TcpSocketSaeaSession session, ConnectionWorkType type, long accessId)
 {
     SendTo(session, MessageHead.C_GLOBAL_CONNECT,
            new AckPack()
     {
         AccessId  = accessId,   //当前主控端标识
         AccessKey = AppConfiguartion.AccessKey,
         Type      = type
     });
 }
 /// <summary>
 /// 验证是否允许连接
 /// </summary>
 /// <param name="type"></param>
 /// <param name="id"></param>
 /// <param name="key"></param>
 /// <returns></returns>
 private bool ValidityAccessIdWithKey(ConnectionWorkType type, long id, long key)
 {
     if (type == ConnectionWorkType.MainApplicationConnection && ApplicationConfiguartion.Options.MainApplicationAnonyMous)
     {
         return(key.Equals(ApplicationConfiguartion.Options.MainAppAccessKey));//主控端允许匿名Id登陆
     }
     else if (type == ConnectionWorkType.MainApplicationConnection && !ApplicationConfiguartion.Options.MainApplicationAnonyMous)
     {
         return(ApplicationConfiguartion.Options.MainApplicationAllowAccessId.Contains(id) && ApplicationConfiguartion.Options.MainAppAccessKey.Equals(key));
     }
     else
     {
         return(key.Equals(ApplicationConfiguartion.Options.AccessKey));//其他的暂仅验证AccessKey
     }
 }
예제 #6
0
        private void SendACK(TcpSocketSaeaSession session, ConnectionWorkType type)
        {
            var ackBody = MessageHelper.CopyMessageHeadTo(SiMay.Core.MessageHead.C_GLOBAL_CONNECT,
                                                          new AckPack()
            {
                Type      = (byte)type,
                AccessId  = ApplicationConfiguartion.Options.AccessId,
                AccessKey = type == ConnectionWorkType.MainApplicationConnection ? ApplicationConfiguartion.Options.MainAppAccessKey : ApplicationConfiguartion.Options.AccessKey
            });

            var dataBuilder = new List <byte>();

            dataBuilder.AddRange(BitConverter.GetBytes(ApplicationConfiguartion.Options.AccessId));
            dataBuilder.AddRange(GZipHelper.Compress(ackBody, 0, ackBody.Length));
            session.SendAsync(dataBuilder.ToArray());//构造发送
            dataBuilder.Clear();
        }
예제 #7
0
        private void OnMessage(SessionHandler session)
        {
            object[]           ars             = session.AppTokens;
            ConnectionWorkType sessionWorkType = (ConnectionWorkType)ars[0];

            if (sessionWorkType == ConnectionWorkType.WORKCON)
            {
                //消息扔给消息提供器,由提供器提供消息给所在窗口进行消息处理
                //((MessageAdapter)ars[1]).OnSessionNotify(session, SessionNotifyType.Message);
            }
            else if (sessionWorkType == ConnectionWorkType.MAINCON)
            {
                MessageHead cmd = session.CompletedBuffer.GetMessageHead();
                switch (cmd)
                {
                case MessageHead.C_MAIN_LOGIN:    //上线包
                    this.ProcessLogin(session);
                    break;

                case MessageHead.C_MAIN_SCREENWALL_IMG:    //屏幕视图数据
                    this.ProcessDesktopViewData(session, session.CompletedBuffer.GetMessageBody());
                    break;
                }
            }
            else if (sessionWorkType == ConnectionWorkType.NONE) //初始消息只能进入该方法块处理,连接密码验证正确才能正式处理消息
            {
                switch (session.CompletedBuffer.GetMessageHead())
                {
                case MessageHead.C_GLOBAL_CONNECT:    //连接确认包
                                                      //CheckSessionValidity(session);

                    session.AppTokens[0] = ConnectionWorkType.MAINCON;

                    byte[] data = MessageHelper.CopyMessageHeadTo(MessageHead.S_GLOBAL_OK);
                    session.SendAsync(data);

                    break;

                default:
                    session.SessionClose();    //伪造包断掉
                    break;
                }
            }
        }
예제 #8
0
        public static TcpSessionApplicationWorkerConnection CreateApplicationWorkerChannelDispatcher(this ApportionDispatcher apportionDispatcher, IDictionary <long, TcpSessionChannelDispatcher> dispatchers, ConnectionWorkType workType)
        {
            var workerConnection = new TcpSessionApplicationWorkerConnection();

            workerConnection.ConnectionWorkType = workType;
            workerConnection.SetSession(apportionDispatcher.CurrentSession);
            return(workerConnection);
        }
예제 #9
0
        public static TcpSessionApplicationWorkerConnection CreateApplicationWorkerChannelDispatcher(this ApportionDispatcher apportionDispatcher, IDictionary <long, TcpSessionChannelDispatcher> dispatchers, ConnectionWorkType workType)
        {
            var workerConnection = new TcpSessionApplicationWorkerConnection();

            workerConnection.ConnectionWorkType = workType;
            workerConnection.SetSession(apportionDispatcher.GetCurrentSession());

            var bufferData = apportionDispatcher.ListByteBuffer.ToArray();

            if (bufferData.Length > 0)//如缓冲区有数据,则处理消息
            {
                workerConnection.ListByteBuffer.AddRange(bufferData);
            }
            return(workerConnection);
        }
예제 #10
0
        private void ApportionTypeHandlerEvent(ApportionDispatcher apportionDispatcher, ConnectionWorkType type)
        {
            switch (type)
            {
            case ConnectionWorkType.MainServiceConnection:
                this.MainServiceConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.MainApplicationConnection:
                this.MainApplicationConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.ApplicationServiceConnection:
                this.ApplicationServiceConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.ApplicationConnection:
                this.ApplicationConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.None:
                break;

            default:
                break;
            }
        }
        private void ApportionTypeHandlerEvent(ApportionDispatcher apportionDispatcher, ConnectionWorkType type)
        {
            switch (type)
            {
            case ConnectionWorkType.MainServiceConnection:
                this.MainServiceConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.MainApplicationConnection:
                this.MainApplicationConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.ApplicationServiceConnection:
                this.ApplicationServiceConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.ApplicationConnection:
                this.ApplicationConnect(apportionDispatcher);
                break;

            case ConnectionWorkType.None:
                break;

            default:
                break;
            }
            this.LogOutputEventHandler?.Invoke(LogOutLevelType.Debug, $"工作类型:{type.ToString()} 的连接已分配!");
        }