105 lines
3.5 KiB
C#
Raw Normal View History

2024-10-18 18:41:02 +08:00
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<IByteBuffer>
{
Action<string> recvMsgAction;
public DotNettyServerHandler(Action<string> 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);
}
});
}
}
}