/// <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);
            }
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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();
                    });
                }
            }
        }
Example #5
0
        /// <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);
            }
        }
Example #6
0
        /// <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);
            }
        }
Example #7
0
        /// <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);
 }
Example #9
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="context"></param>
 public override void ChannelInactive(IChannelHandlerContext context)
 {
     logger.LogInformation($"Channel inactived. Local={context.GetLocalNetString()}, Remote={context.GetRemoteNetString()}");
 }
Example #10
0
        /// <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);
        }
Example #11
0
        /// <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);
            }
        }
Example #13
0
 /// <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());
 }
Example #15
0
 /// <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);
 }
Example #16
0
        /// <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);
            }
        }