Exemplo n.º 1
0
        /// <summary>
        /// 单向发送消息到服务器
        /// </summary>
        /// <param name="msg">消息数据</param>
        /// <param name="timeout">超时时长(毫秒)</param>
        /// <returns></returns>
        public async Task SendOneWayAsync(DotNettyData msg, int timeout = 30000)
        {
            var request = requestManager.CreateRequest(timeout, msg.SerialNumber);
            await channel.WriteAndFlushAsync(msg);

            await request.Task;
        }
Exemplo n.º 2
0
 protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg)
 {
     ThreadPool.QueueUserWorkItem((object state) =>
     {
         try
         {
             byte[] bytes        = (byte[])state;
             DotNettyData result = (DotNettyData)ByteExtension.ByteArrayToObject(bytes);
             requestManager.CompleteRequest(result.SerialNumber, result);
         }
         catch (Exception ex)
         {
             LogsManager.Error("处理服务端结果失败");
         }
     }, msg);
 }
Exemplo n.º 3
0
        /// <summary>
        /// 请求完成
        /// </summary>
        /// <param name="requestId">RequestId</param>
        /// <param name="result">承载请求响应的消息对象</param>
        public void CompleteRequest(string requestId, DotNettyData result)
        {
            if (!requestList.TryRemove(requestId, out RequestInfo request))
            {
                return;
            }

            try
            {
                request.CancellationTokenSource.Dispose();
                request.TaskCompletionSource.SetResult(result);
                LogsManager.Debug($"Request completed. Request={request.Id}");
            }
            catch (Exception ex)
            {
                LogsManager.Error(ex, $"Request has error. ExceptionMessage={ex.Message}");
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 发送消息到服务器
        /// </summary>
        /// <param name="msg">消息数据</param>
        /// <param name="continueOnCapturedContext">配置用于等待此 System.Threading.Tasks.Task`1的 awaiter。</param>
        /// <param name="timeout">超时时长(毫秒)</param>
        /// <returns></returns>
        public async Task <DotNettyData> SendAsync(DotNettyData msg, bool continueOnCapturedContext = true, int timeout = 30000)
        {
            var request = requestManager.CreateRequest(timeout, msg.SerialNumber);

            try
            {
                await channel.WriteAndFlushAsync(msg).ConfigureAwait(continueOnCapturedContext);
            }
            catch (AggregateException ex)
            {
                if (ex.InnerException is ClosedChannelException || ex.InnerException is SocketException)
                {
                    throw new NetworkException(host, port, ex.InnerException.Message);
                }
                throw ex;
            }
            var result = await request.Task;

            return(result);
        }
Exemplo n.º 5
0
        protected override void ChannelRead0(IChannelHandlerContext context, byte[] bytes)
        {
            DotNettyData data = (DotNettyData)ByteExtension.ByteArrayToObject(bytes);

            if (serviceRecieveHandler != null && data != null)
            {
                Task.Run(() =>
                {
                    try
                    {
                        var handlerResult = serviceRecieveHandler(data);
                        if (handlerResult != null)
                        {
                            context.WriteAndFlushAsync(handlerResult);
                        }
                    }
                    catch (Exception ex)
                    {
                        //ex.Error();
                    }
                });
            }
        }