105 lines
3.5 KiB
C#
105 lines
3.5 KiB
C#
![]() |
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);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|