Socket之心跳包实现思路

原  https://www.cnblogs.com/snaildev/p/7724867.html 

心跳包的实现思路:

客户端连接上服务端后,在服务端会维护一个在线客户端列表。客户端每隔一段时间,向服务端发送一个心跳包,服务端受收到包以后,会更新客户端最近一次在线时间。一旦服务端超过规定时间没有接收到客户端发来的包,则视为掉线。

 

代码:

客户端每隔一段时间,发送一个心跳包:



var timer = new System.Timers.Timer();

timer.Interval = 60000;  //1m触发一次

timer.Start();



timer.Elapsed += (sender, args) =>

 {

     Console.WriteLine("开始发送心跳包");

     MMessage message = new MMessage();

     message.MessageType = MessagePicks.Heartbeat;

     // message.From = loginName;



    WriteToStream(message);

 };

 

服务端每隔一段时间检测:        


var timer = new Timer();

timer.Interval = 60000;  //1m触发一次

timer.Start();

timer.Elapsed += (sender, args) =>

{

    List<MClient> offClients = new List<MClient>();



   foreach (var client in clients)

    {

        if ((DateTime.Now - client.LastOnLine).TotalMinutes > 1)

        {

            Console.WriteLine("用户" + client.Name + "掉线!");

            offClients.Add(client);

        }

    }



   foreach (var offClient in offClients)

    {

        clients.Remove(offClient);

    }

};

  

 

服务端收到心跳包的处理逻辑:

Console.WriteLine("收到客户端" + msg.RemoteEndPoint + "的心跳回应包.");
 
client.LastOnLine = DateTime.Now;  //收到心跳包,更新时间
client.Name = msg.RemoteEndPoint.ToString();
client.RemoteEndPoint = msg.RemoteEndPoint;
 
if (!clients.Contains(client))
 {
     clients.Add(client);
 }

https://www.cnblogs.com/scy251147/p/3333957.html 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的实现思路: 1. 创建一个线程池对象,用于管理多个线程的创建、销毁和调度。 2. 创建一个UDP套接字,用于与服务端进行通信。 3. 在线程池中创建一个定时器线程,设置定时器的时间间隔为1秒。 4. 在定时器线程中,创建一个发送心跳包的线程。在该线程中,通过UDP套接字向服务端发送心跳包,并等待服务端返回数据。 5. 在发送心跳包的线程中,如果接收到服务端返回的数据,则将数据发送给主线程处理。 6. 在主线程中,处理接收到的数据,并根据需要更新UI界面。 下面是一个简单的代码示例,供您参考: ```cpp // 创建UDP套接字 QUdpSocket *udpSocket = new QUdpSocket(this); // 创建线程池对象 QThreadPool *threadPool = QThreadPool::globalInstance(); // 创建定时器线程 QTimer *timer = new QTimer(this); timer->setInterval(1000); QObject::connect(timer, &QTimer::timeout, [=]() { // 在线程池中创建发送心跳包的线程 threadPool->start(new SendHeartbeatThread(udpSocket)); }); timer->start(); // 发送心跳包的线程 class SendHeartbeatThread : public QRunnable { public: SendHeartbeatThread(QUdpSocket *udpSocket) : m_udpSocket(udpSocket) { } void run() override { // 向服务端发送心跳包 m_udpSocket->writeDatagram("heartbeat", QHostAddress::LocalHost, 12345); // 等待服务端返回数据 if (m_udpSocket->waitForReadyRead(1000)) { QByteArray data; data.resize(m_udpSocket->pendingDatagramSize()); m_udpSocket->readDatagram(data.data(), data.size()); // 将数据发送给主线程处理 emit dataReceived(data); } } signals: void dataReceived(const QByteArray &data); private: QUdpSocket *m_udpSocket; }; // 在主线程中处理接收到的数据 QObject::connect(sendThread, &SendHeartbeatThread::dataReceived, [=](const QByteArray &data) { // 处理接收到的数据 }); ``` 注意,这只是一个简单的示例代码,您需要根据实际需求进行适当修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值