選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

188 行
8.2KB

  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. await Task.CompletedTask;
  20. // Handle channel active event
  21. }
  22. public override void ChannelInactive(IChannelHandlerContext context)
  23. {
  24. ReleaseBuffer();
  25. base.ChannelInactive(context);
  26. }
  27. protected override void ChannelRead0(IChannelHandlerContext context, IByteBuffer message)
  28. {
  29. try
  30. {
  31. string content = message.ToString(Encoding.ASCII);
  32. _logger.LogInformation($"{nameof(ProtocolHandler)} -- {nameof(ChannelRead0)} -- 最开始接受内容:{content}");
  33. ProcessMessage(context, content);
  34. }
  35. catch (Exception ex)
  36. {
  37. ReleaseBuffer();
  38. _logger.LogInformation($"{nameof(ProtocolHandler)} --- {nameof(ChannelRead0)} 处理出错\n{ex.Message}\n{ex.StackTrace}");
  39. }
  40. }
  41. private void ProcessMessage(IChannelHandlerContext context, string content)
  42. {
  43. buffer ??= Unpooled.Buffer();
  44. byte[] bytes = Encoding.ASCII.GetBytes(content);
  45. buffer.WriteBytes(Unpooled.WrappedBuffer(bytes));
  46. if (int.TryParse(buffer.ToString(Encoding.ASCII).Substring(0, 4), out int messageLength))
  47. {
  48. Console.WriteLine(buffer.ToString(Encoding.ASCII));
  49. if (buffer.ToString(Encoding.ASCII).Length == messageLength)
  50. {
  51. //var parser = buffer.ToString(Encoding.ASCII);
  52. ProtocolParser parser = new(buffer.ToString(Encoding.ASCII));
  53. context.FireChannelRead(parser);
  54. //Console.WriteLine($"发送正常:{parser}");
  55. //ProtocolWrapper wrapper = new ProtocolWrapper("82", parser.SeqNo, DateTime.Now.ToString("yyyyMMddHHmmss"));
  56. //Console.WriteLine(wrapper.GenerateProtocolString());
  57. //Console.WriteLine($"length:{parser.MessageLength},func_no:{parser.FuncNo},seq_no:{parser.SeqNo},data:{parser.Data}");
  58. ReleaseBuffer();
  59. }
  60. else if (buffer.ToString(Encoding.ASCII).Length > messageLength)
  61. {
  62. string inputString = buffer.ToString(Encoding.ASCII);
  63. var nextMessageLength = messageLength;
  64. var startIndex = 0;
  65. var messagesStringLength = 0;
  66. List<string> messages = new List<string>();
  67. while (startIndex < inputString.Length)
  68. {
  69. try
  70. {
  71. string message = inputString.Substring(startIndex, nextMessageLength);
  72. messages.Add(message);
  73. startIndex += nextMessageLength;
  74. if (startIndex + 4 <= inputString.Length)
  75. {
  76. if (!int.TryParse(inputString.Substring(startIndex, 4), out nextMessageLength))
  77. {
  78. break;
  79. }
  80. }
  81. else
  82. {
  83. break;
  84. }
  85. }
  86. catch (Exception)
  87. {
  88. break;
  89. }
  90. }
  91. foreach (var message in messages)
  92. {
  93. ProtocolParser parser = new(message);
  94. context.FireChannelRead(parser);
  95. messagesStringLength += message.Length;
  96. // Console.WriteLine(message);
  97. }
  98. // 过长且不完整
  99. if (inputString.Length > messagesStringLength)
  100. {
  101. var overLongbuffer = Unpooled.Buffer();
  102. overLongbuffer.WriteBytes(Unpooled.WrappedBuffer(Encoding.ASCII.GetBytes(inputString.Substring(messageLength, inputString.Length- messageLength))));
  103. ReleaseBuffer();
  104. buffer = overLongbuffer;
  105. }
  106. // 数据完整
  107. if (inputString.Length == messagesStringLength)
  108. {
  109. ReleaseBuffer();
  110. }
  111. //Console.WriteLine($"{stringLength},{inputString.Length}");
  112. // var parser = buffer.ToString(Encoding.ASCII).Substring(0, messageLength);
  113. //ProtocolParser parser = new(buffer.ToString(Encoding.ASCII).Substring(0, messageLength));
  114. //context.FireChannelRead(parser);
  115. ////ReleaseBuffer();
  116. //var overLongbuffer = Unpooled.Buffer();
  117. //Console.WriteLine($"过长消息:{buffer.ToString(Encoding.ASCII).Substring(messageLength)}");
  118. //overLongbuffer.WriteBytes(Unpooled.WrappedBuffer(Encoding.ASCII.GetBytes(buffer.ToString(Encoding.ASCII).Substring(messageLength))));
  119. //ReleaseBuffer();
  120. //buffer = overLongbuffer;
  121. //Console.WriteLine($"剩余消息{buffer.ToString(Encoding.ASCII)}");
  122. }
  123. }
  124. }
  125. private void ProcessMessage2(IChannelHandlerContext context, string content)
  126. {
  127. buffer ??= Unpooled.Buffer();
  128. byte[] bytes = Encoding.ASCII.GetBytes(content);
  129. buffer.WriteBytes(Unpooled.WrappedBuffer(bytes));
  130. if (int.TryParse(buffer.ToString(Encoding.ASCII).Substring(0, 4), out int messageLength))
  131. {
  132. Console.WriteLine(buffer.ToString(Encoding.ASCII));
  133. if (buffer.ToString(Encoding.ASCII).Length == messageLength)
  134. {
  135. //var parser = buffer.ToString(Encoding.ASCII);
  136. ProtocolParser parser = new(buffer.ToString(Encoding.ASCII));
  137. context.FireChannelRead(parser);
  138. Console.WriteLine($"发送正常:{parser}");
  139. //ProtocolWrapper wrapper = new ProtocolWrapper("82", parser.SeqNo, DateTime.Now.ToString("yyyyMMddHHmmss"));
  140. //Console.WriteLine(wrapper.GenerateProtocolString());
  141. Console.WriteLine($"length:{parser.MessageLength},func_no:{parser.FuncNo},seq_no:{parser.SeqNo},data:{ parser.Data}");
  142. ReleaseBuffer();
  143. }
  144. else if (buffer.ToString(Encoding.ASCII).Length > messageLength)
  145. {
  146. // var parser = buffer.ToString(Encoding.ASCII).Substring(0, messageLength);
  147. ProtocolParser parser = new(buffer.ToString(Encoding.ASCII).Substring(0, messageLength));
  148. context.FireChannelRead(parser);
  149. //ReleaseBuffer();
  150. var overLongbuffer = Unpooled.Buffer();
  151. Console.WriteLine($"过长消息:{buffer.ToString(Encoding.ASCII).Substring(messageLength)}");
  152. overLongbuffer.WriteBytes(Unpooled.WrappedBuffer(Encoding.ASCII.GetBytes(buffer.ToString(Encoding.ASCII).Substring(messageLength))));
  153. ReleaseBuffer();
  154. buffer = overLongbuffer;
  155. Console.WriteLine($"剩余消息{buffer.ToString(Encoding.ASCII)}");
  156. }
  157. }
  158. }
  159. private void ReleaseBuffer()
  160. {
  161. buffer?.Release();
  162. buffer = null;
  163. }
  164. }
  165. }