using System; using System.Text; using System.Threading.Tasks; using Abp.Dependency; using DotNetty.Buffers; using DotNetty.Transport.Bootstrapping; using DotNetty.Transport.Channels; using DotNetty.Transport.Channels.Sockets; using ToolLibrary.LogHelper; namespace Yunda.SOMS.DataMonitoringServer.TcpSocket.Server { using static ConstValue; public class DotNettyServerHandler : SimpleChannelInboundHandler { Action recvMsgAction; public DotNettyServerHandler(Action recvMsgAc) { recvMsgAction = recvMsgAc; } public override void ChannelActive(IChannelHandlerContext context) { // 当连接建立时,启动心跳发送 StartHeartbeat(context); base.ChannelActive(context); } protected override void ChannelRead0(IChannelHandlerContext ctx, IByteBuffer msg) { string receivedMessage = msg.ToString(Encoding.ASCII); // 检查是否为心跳消息 if (receivedMessage == HeartbeatMessage) { //De.WriteLine("收到服务器心跳包"); return; // 只处理心跳,不作其他响应 } Log4Helper.Info(this.GetType(),$"收到消息: {receivedMessage}"); recvMsgAction(receivedMessage); // 准备回复的消息内容 string responseMessage = "ok"; byte[] messageBytes = Encoding.ASCII.GetBytes(responseMessage); // 开始位 + 数据长度 + 数据内容 + 结束位 IByteBuffer responseBuffer = Unpooled.Buffer(1 + 4 + messageBytes.Length + 1); // 添加开始位 responseBuffer.WriteByte(StartByte); // 添加数据长度(占用4个字节) responseBuffer.WriteInt(messageBytes.Length); // 添加实际数据内容 responseBuffer.WriteBytes(messageBytes); // 添加结束位 responseBuffer.WriteByte(StartByte); // 发送完整的消息包给客户端 ctx.WriteAndFlushAsync(responseBuffer); } public override void ExceptionCaught(IChannelHandlerContext context, Exception ex) { Log4Helper.Error(this.GetType(), $"收到消息: {ex.Message}",ex); context.CloseAsync(); } private void StartHeartbeat(IChannelHandlerContext context) { Task.Run(async () => { while (context.Channel.Active) { // 构建心跳包 byte[] heartbeatBytes = Encoding.ASCII.GetBytes(HeartbeatMessage); IByteBuffer heartbeatBuffer = Unpooled.Buffer(1 + 4 + heartbeatBytes.Length + 1); // 添加开始位 heartbeatBuffer.WriteByte(StartByte); // 添加数据长度 heartbeatBuffer.WriteInt(heartbeatBytes.Length); // 添加心跳标志 heartbeatBuffer.WriteBytes(heartbeatBytes); // 添加结束位 heartbeatBuffer.WriteByte(EndByte); // 发送心跳包 await context.WriteAndFlushAsync(heartbeatBuffer); Console.WriteLine("发送心跳包"); // 等待心跳间隔 await Task.Delay(HeartbeatInterval); } }); } } }