您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

92 行
3.7KB

  1. using DotNetty.Buffers;
  2. using DotNetty.Transport.Channels;
  3. using Microsoft.Extensions.Logging;
  4. using NearCardAttendance.Service.TcpServer.Protocol;
  5. using System;
  6. using System.Text;
  7. namespace NearCardAttendance.Service.TcpServer.Handler
  8. {
  9. public class ProtocolHandler : SimpleChannelInboundHandler<IByteBuffer>
  10. {
  11. private IByteBuffer? buffer;
  12. private readonly ILogger<ProtocolHandler> _logger;
  13. public ProtocolHandler(ILogger<ProtocolHandler> logger)
  14. {
  15. _logger = logger;
  16. }
  17. public override async void ChannelActive(IChannelHandlerContext context)
  18. {
  19. // Handle channel active event
  20. }
  21. public override void ChannelInactive(IChannelHandlerContext context)
  22. {
  23. ReleaseBuffer();
  24. base.ChannelInactive(context);
  25. }
  26. protected override void ChannelRead0(IChannelHandlerContext context, IByteBuffer message)
  27. {
  28. try
  29. {
  30. string content = message.ToString(Encoding.ASCII);
  31. _logger.LogInformation($"{nameof(ProtocolHandler)} -- {nameof(ChannelRead0)} -- 最开始接受内容:{content}");
  32. ProcessMessage(context, content);
  33. }
  34. catch (Exception ex)
  35. {
  36. ReleaseBuffer();
  37. _logger.LogInformation($"{nameof(ProtocolHandler)} --- {nameof(ChannelRead0)} 处理出错\n{ex.Message}\n{ex.StackTrace}");
  38. }
  39. }
  40. private void ProcessMessage(IChannelHandlerContext context, string content)
  41. {
  42. buffer ??= Unpooled.Buffer();
  43. byte[] bytes = Encoding.ASCII.GetBytes(content);
  44. buffer.WriteBytes(Unpooled.WrappedBuffer(bytes));
  45. if (int.TryParse(buffer.ToString(Encoding.ASCII).Substring(0, 4), out int messageLength))
  46. {
  47. Console.WriteLine(buffer.ToString(Encoding.ASCII));
  48. if (buffer.ToString(Encoding.ASCII).Length == messageLength)
  49. {
  50. //var parser = buffer.ToString(Encoding.ASCII);
  51. ProtocolParser parser = new(buffer.ToString(Encoding.ASCII));
  52. context.FireChannelRead(parser);
  53. Console.WriteLine($"发送正常:{parser}");
  54. //ProtocolWrapper wrapper = new ProtocolWrapper("82", parser.SeqNo, DateTime.Now.ToString("yyyyMMddHHmmss"));
  55. //Console.WriteLine(wrapper.GenerateProtocolString());
  56. Console.WriteLine($"length:{parser.MessageLength},func_no:{parser.FuncNo},seq_no:{parser.SeqNo},data:{ parser.Data}");
  57. ReleaseBuffer();
  58. }
  59. else if (buffer.ToString(Encoding.ASCII).Length > messageLength)
  60. {
  61. // var parser = buffer.ToString(Encoding.ASCII).Substring(0, messageLength);
  62. ProtocolParser parser = new(buffer.ToString(Encoding.ASCII).Substring(0, messageLength));
  63. context.FireChannelRead(parser);
  64. //ReleaseBuffer();
  65. var overLongbuffer = Unpooled.Buffer();
  66. Console.WriteLine($"过长消息:{buffer.ToString(Encoding.ASCII).Substring(messageLength)}");
  67. overLongbuffer.WriteBytes(Unpooled.WrappedBuffer(Encoding.ASCII.GetBytes(buffer.ToString(Encoding.ASCII).Substring(messageLength))));
  68. ReleaseBuffer();
  69. buffer = overLongbuffer;
  70. Console.WriteLine($"剩余消息{buffer.ToString(Encoding.ASCII)}");
  71. }
  72. }
  73. }
  74. private void ReleaseBuffer()
  75. {
  76. buffer?.Release();
  77. buffer = null;
  78. }
  79. }
  80. }