You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

75 lines
2.9 KiB

  1. using DotNetty.Buffers;
  2. using DotNetty.Transport.Channels;
  3. using System;
  4. using Microsoft.Extensions.Logging;
  5. using JT1078.DotNetty.Core.Enums;
  6. using JT1078.DotNetty.Core.Services;
  7. using JT1078.Protocol;
  8. using JT1078.DotNetty.Core.Interfaces;
  9. using JT1078.DotNetty.Core.Session;
  10. using JT1078.DotNetty.Core.Metadata;
  11. namespace JT1078.DotNetty.Tcp.Handlers
  12. {
  13. /// <summary>
  14. /// JT1078 服务端处理程序
  15. /// </summary>
  16. internal class JT1078TcpServerHandler : SimpleChannelInboundHandler<byte[]>
  17. {
  18. private readonly JT1078TcpSessionManager SessionManager;
  19. private readonly JT1078AtomicCounterService AtomicCounterService;
  20. private readonly ILogger<JT1078TcpServerHandler> logger;
  21. private readonly IJT1078TcpMessageHandlers handlers;
  22. private readonly IJT1078SourcePackageDispatcher sourcePackageDispatcher;
  23. public JT1078TcpServerHandler(
  24. IJT1078SourcePackageDispatcher sourcePackageDispatcher,
  25. IJT1078TcpMessageHandlers handlers,
  26. ILoggerFactory loggerFactory,
  27. JT1078AtomicCounterServiceFactory atomicCounterServiceFactory,
  28. JT1078TcpSessionManager sessionManager)
  29. {
  30. this.sourcePackageDispatcher = sourcePackageDispatcher;
  31. this.handlers = handlers;
  32. this.SessionManager = sessionManager;
  33. this.AtomicCounterService = atomicCounterServiceFactory.Create(JT1078TransportProtocolType.tcp);
  34. logger = loggerFactory.CreateLogger<JT1078TcpServerHandler>();
  35. }
  36. protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg)
  37. {
  38. try
  39. {
  40. sourcePackageDispatcher.SendAsync(msg);
  41. if (logger.IsEnabled(LogLevel.Trace))
  42. {
  43. logger.LogTrace("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString());
  44. logger.LogTrace("accept msg <<< " + ByteBufferUtil.HexDump(msg));
  45. }
  46. JT1078Package package = JT1078Serializer.Deserialize(msg);
  47. AtomicCounterService.MsgSuccessIncrement();
  48. SessionManager.TryAdd(package.SIM, ctx.Channel);
  49. handlers.Processor(new JT1078Request(package, msg));
  50. if (logger.IsEnabled(LogLevel.Debug))
  51. {
  52. logger.LogDebug("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString());
  53. }
  54. }
  55. catch (Exception ex)
  56. {
  57. AtomicCounterService.MsgFailIncrement();
  58. if (logger.IsEnabled(LogLevel.Error))
  59. {
  60. logger.LogError("accept package fail count<<<" + AtomicCounterService.MsgFailCount.ToString());
  61. logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg));
  62. }
  63. }
  64. }
  65. }
  66. }