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, $"未知消息,连接被关闭!"); } }
/// <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 } }
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(); }
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; } } }
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); }
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); }
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()} 的连接已分配!"); }