using DotNetty.Buffers; using DotNetty.Transport.Channels; using System; using Microsoft.Extensions.Logging; using JT1078.DotNetty.Core.Enums; using JT1078.DotNetty.Core.Services; using JT1078.Protocol; using JT1078.DotNetty.Core.Interfaces; using JT1078.DotNetty.Core.Session; using JT1078.DotNetty.Core.Metadata; namespace JT1078.DotNetty.Tcp.Handlers { /// /// JT1078 服务端处理程序 /// internal class JT1078TcpServerHandler : SimpleChannelInboundHandler { private readonly JT1078TcpSessionManager SessionManager; private readonly JT1078AtomicCounterService AtomicCounterService; private readonly ILogger logger; private readonly IJT1078TcpMessageHandlers handlers; private readonly IJT1078SourcePackageDispatcher sourcePackageDispatcher; public JT1078TcpServerHandler( IJT1078SourcePackageDispatcher sourcePackageDispatcher, IJT1078TcpMessageHandlers handlers, ILoggerFactory loggerFactory, JT1078AtomicCounterServiceFactory atomicCounterServiceFactory, JT1078TcpSessionManager sessionManager) { this.sourcePackageDispatcher = sourcePackageDispatcher; this.handlers = handlers; this.SessionManager = sessionManager; this.AtomicCounterService = atomicCounterServiceFactory.Create(JT1078TransportProtocolType.tcp); logger = loggerFactory.CreateLogger(); } protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg) { try { sourcePackageDispatcher.SendAsync(msg); if (logger.IsEnabled(LogLevel.Trace)) { logger.LogTrace("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString()); logger.LogTrace("accept msg <<< " + ByteBufferUtil.HexDump(msg)); } JT1078Package package = JT1078Serializer.Deserialize(msg); AtomicCounterService.MsgSuccessIncrement(); SessionManager.TryAdd(package.SIM, ctx.Channel); handlers.Processor(new JT1078Request(package, msg)); if (logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString()); } } catch (Exception ex) { AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError("accept package fail count<<<" + AtomicCounterService.MsgFailCount.ToString()); logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg)); } } } } }