/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="evt"></param> public override void UserEventTriggered(IChannelHandlerContext context, object evt) { var idleStateEvt = evt as IdleStateEvent; if (idleStateEvt == null) { base.UserEventTriggered(context, evt); return; } if (idleStateEvt.First && idleStateEvt.State == IdleStateEvent.AllIdleStateEvent.State) { var heartBeat = BuildHeatBeat(); logger.LogDebug($"Send heart beat message request. HeartBeat={heartBeat}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); context.WriteAndFlushAsync(heartBeat); } }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="message"></param> public override void ChannelRead(IChannelHandlerContext context, object message) { var xnodeMessage = (Message)message; if (xnodeMessage.Header != null && xnodeMessage.Header.Type == MessageType.HEARTBEAT_RESP) { logger.LogDebug($"Receive heart beat message response. Message={xnodeMessage}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); } else { base.ChannelRead(context, message); } }
/// <summary> /// /// </summary> /// <param name="context"></param> public override void ChannelActive(IChannelHandlerContext context) { ChannelState.SetLoginState(context, false); logger.LogDebug($"Channel actived. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); channelHandlerContextManager.Regist(context); base.ChannelActive(context); }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="message"></param> public override void ChannelRead(IChannelHandlerContext context, object message) { var msg = (Message)message; var loginState = ChannelState.GetLoginState(context); //如果是握手请求消息,处理,其它消息透传 if (msg.Header != null && msg.Header.Type == MessageType.LOGIN_REQ && loginState != null) { loginState.IsLoginSuccess = false; if (loginRecieveHandler != null) { Task.Run(() => { loginRecieveHandler(new LoginAuthInfo() { Body = msg.Body, Attachments = msg.Header.Attachments, RemoteAddress = context.GetRemoteAddress() }).ContinueWith(t => { var resData = t.Result; if (resData != null) { loginState.IsLoginSuccess = resData.AuthResult; loginState.Identity = resData.AuthIdentity; loginState.RemoteAddress = context.GetRemoteAddress(); if (loginState.IsLoginSuccess) { logger.LogInformation($"Login success. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); var loginResp = BuildResponse(resData); context.WriteAndFlushAsync(loginResp); } else { logger.LogDebug($"Login failed. MessageType={msg.Header.Type}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, AuthStatusCode={resData.AuthStatusCode}, AuthFailedMessage={resData.AuthFailedMessage}"); var loginResp = BuildResponse(resData); context.WriteAndFlushAsync(loginResp).ContinueWith(task => { context.CloseAsync(); }); } } else { logger.LogDebug($"Drop message because LoginResponseData is null. MessageType={msg.Header.Type}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); var loginResp = BuildResponse((byte)AuthStatusCodes.LoginResponseDataIsNull); context.WriteAndFlushAsync(loginResp).ContinueWith(task => { context.CloseAsync(); }); } }); }); } else { logger.LogDebug($"Drop message because LoginRecieveHandler is null. MessageType={msg.Header.Type}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); var loginResp = BuildResponse((byte)AuthStatusCodes.LoginRecieveHandlerIsNull); context.WriteAndFlushAsync(loginResp).ContinueWith(task => { context.CloseAsync(); }); } } else { if (loginState != null && loginState.IsLoginSuccess) { context.FireChannelRead(msg); } else { logger.LogDebug($"Drop message because no login. MessageType={msg.Header.Type}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); var loginResp = BuildResponse((byte)AuthStatusCodes.NoLogin); context.WriteAndFlushAsync(loginResp).ContinueWith(task => { context.CloseAsync(); }); } } }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="message"></param> public override void ChannelRead(IChannelHandlerContext context, object message) { var msg = (Message)message; //如果是握手应答消息,需要判断是否认证成功 if (msg.Header != null && msg.Header.Type == MessageType.LOGIN_RESP) { if (loginResponseHandler != null) { Task.Run(() => { var channelName = context.GetChannelName(); loginResponseHandler(channelName, msg.Body, msg.Header.Attachments).ContinueWith(t => { var loginResult = t.Result; if (loginResult == 0) { logger.LogInformation($"Login success. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, Message={msg}"); } else { logger.LogError($"Login failed. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, LoginResult={loginResult}"); //握手失败 context.CloseAsync(); } }); }); } else { var loginResult = msg.Body; if (loginResult.Length != 1 || loginResult[0] != (byte)0) { logger.LogError($"Login failed. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, LoginResult={loginResult[0]}"); //握手失败 context.CloseAsync(); } else { logger.LogInformation($"Login success. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, Message={msg}"); context.FireChannelRead(message); } } } else { context.FireChannelRead(message); } }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="message"></param> public override void ChannelRead(IChannelHandlerContext context, object message) { var msg = (Message)message; RequestManager requestManager = null; if (serviceResponseHandler != null) { var channelName = context.GetChannelName(); requestManager = serviceResponseHandler(channelName); } //如果是服务响应消息,处理,其它消息透传 if (msg.Header != null && msg.Header.Type == MessageType.SERVICE_RESP) { logger.LogDebug($"Get request result. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); if (requestManager != null) { requestManager.CompleteRequest(msg.Header.RequestId, msg); } } else { context.FireChannelRead(message); } }
/// <summary> /// /// </summary> /// <param name="context"></param> public async override void ChannelInactive(IChannelHandlerContext context) { logger.LogInformation($"Channel inactived. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); base.ChannelInactive(context); var channelName = context.GetChannelName(); await inactiveHandler?.Invoke(channelName); }
public override void ChannelInactive(IChannelHandlerContext context) { LogsManager.Info($"Channel inactived. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); base.ChannelInactive(context); }
/// <summary> /// /// </summary> /// <param name="context"></param> public override void ChannelInactive(IChannelHandlerContext context) { logger.LogInformation($"Channel inactived. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="exception"></param> public async override void ExceptionCaught(IChannelHandlerContext context, Exception exception) { if (exception is SocketException) { logger.LogError(exception, $"Socket exception. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, ExceptionMessage={exception.Message}"); } else { logger.LogError(exception, $"Unhandle exception. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, ExceptionMessage={exception.Message}"); } await context.CloseAsync(); logger.LogInformation($"Channel closed because has an unhandle exception. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); context.FireExceptionCaught(exception); }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="exception"></param> public async override void ExceptionCaught(IChannelHandlerContext context, Exception exception) { if (exception is ReadTimeoutException) { logger.LogError($"Timeout. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); await context.CloseAsync(); logger.LogInformation($"Connect closed because timeout. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); } else { logger.LogError(exception, $"Unhandle exception. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, ExceptionMessage={exception.Message}"); await context.CloseAsync(); //发生错误时主动关闭连接 context.FireExceptionCaught(exception); //如果只通过FireExceptionCaught抛出的异常不会导致进程崩溃和连接中断 } }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="message"></param> public override void ChannelRead(IChannelHandlerContext context, object message) { var xnodeMessage = (Message)message; if (xnodeMessage.Header != null && xnodeMessage.Header.Type == MessageType.HEARTBEAT_REQ) { logger.LogDebug($"Receive heart beat message request. Message={xnodeMessage}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); var heartBeat = BuildHeatBeat(); logger.LogDebug($"Send heart beat message response. HeartBeat={heartBeat}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); context.WriteAndFlushAsync(heartBeat); } else { base.ChannelRead(context, message); } }
/// <summary> /// 获取Channel名称,格式:Host:Port|LocalHost:LocalPort /// </summary> /// <param name="context"></param> /// <returns></returns> public static string GetChannelName(this IChannelHandlerContext context) { return($"{context.GetRemoteNetString()}|{context.GetLocalNetString()}"); }
/// <summary> /// 获取Channel名称 /// </summary> /// <param name="context"></param> /// <returns></returns> public static string GetChannelName(this IChannelHandlerContext context) { return(context.GetRemoteNetString()); }
/// <summary> /// /// </summary> /// <param name="context"></param> public override void ChannelUnregistered(IChannelHandlerContext context) { logger.LogInformation($"Channel unregistered. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); base.ChannelUnregistered(context); }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="message"></param> public override void ChannelRead(IChannelHandlerContext context, object message) { var msg = (Message)message; var loginState = ChannelState.GetLoginState(context); //如果是服务请求消息则进行处理,其它消息则透传 if (msg.Header != null && msg.Header.Type == MessageType.SERVICE_REQ) { logger.LogDebug($"Recieve service message. RequestId={msg.Header.RequestId}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); if (serviceRecieveHandler != null) { Task.Run(() => { var handlerTask = serviceRecieveHandler(msg.Body, msg.Header.Attachments, loginState); if (handlerTask != null) { handlerTask.ContinueWith(task => { context.WriteAndFlushAsync(BuildResponse(msg.Header.RequestId, task.Result)); logger.LogDebug($"Service is response. RequestId={msg.Header.RequestId}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); }); } }); } } else if (msg.Header != null && msg.Header.Type == MessageType.ONE_WAY) { logger.LogDebug($"Recieve oneway service message. RequestId={msg.Header.RequestId}, Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); if (serviceRecieveHandler != null) { Task.Run(() => { serviceRecieveHandler?.Invoke(msg.Body, msg.Header.Attachments, loginState); }); } } else { context.FireChannelRead(message); } }
public async override void ExceptionCaught(IChannelHandlerContext context, Exception exception) { if (exception is SocketException) { LogsManager.Error(exception, $"Socket exception. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, ExceptionMessage={exception.Message}"); await socketExceptionHandler?.Invoke(); } else { LogsManager.Error(exception, $"Unhandle exception. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}, ExceptionMessage={exception.Message}"); await context.CloseAsync(); LogsManager.Info($"Channel closed because has an unhandle exception. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}"); context.FireExceptionCaught(exception); } }