zoukankan      html  css  js  c++  java
  • Unity3D 心跳检测

    在B/S结构的项目开发的过程当中

    在服务端与客户端正常的通信之外

    服务端通常还需要知道客户端是否还处于连接状态

    或者客户端也需要知道服务端是否还处在开启状态

    大白话说完了,听一下比较正统的解释吧(摘自网络):

    1:轮询机制

    轮询:概括来说是服务端定时主动的去与要监控状态的客户端(或者叫其他系统)通信,询问当前的某种状态,客户端返回状态信息,客户端没有返回或返回错误、失效信息、则认为客户端已经宕机,然后服务端自己内部把这个客户端的状态保存下来(宕机或者其他),如果客户端正常,那么返回正常状态,如果客户端宕机或者返回的是定义的失效状态那么当前的客户端状态是能够及时的监控到的,如果客户端宕机之后重启了那么当服务端定时来轮询的时候,还是可以正常的获取返回信息,把其状态重新更新。

    2:心跳机制

    心跳:最终得到的结果是与轮询一样的但是实现的方式有差别,心跳不是服务端主动去发信息检测客户端状态,而是在服务端保存下来所有客户端的状态信息,然后等待客户端定时来访问服务端,更新自己的当前状态,如果客户端超过指定的时间没有来更新状态,则认为客户端已经宕机或者其状态异常。

    心跳比起轮询有两个优势:

    1.避免服务端的压力

    2.灵活好控制

    原理

    1.与服务端约定好接口内容post请求和get请求都可以(安全起见还是post比较好)。如果服务端正常,则返回true。如果返回异常信息,或者回应超时,则判定服务端不正常。

    2.设计好心跳时间。可以写一个协程,在Start中便运行,在协程中控制心跳时间。使用while循环,保证客户端只要开启就一直循环下去。

    IEnumerator Start()
        {
            while (true)
            {
                string url = "http://" + AppData.ServerIP + "/UnityAPI/GetSystemState";
                WWWForm form = new WWWForm();
                byte[] a = new byte[] { 1 };
                WWW www = new WWW(url, a);
                yield return www;
    
                if (null != www.error)
                {
                    bClosed = true;
                }
                else
                {
                    if (!bool.Parse(www.text))
                    {
                        bClosed = true;
                    }
                    else
                    {
                        bClosed = false;
                    }
                }
                if (bClosed)
                {
                    LoseServer();
                }
                yield return new WaitForSeconds(5f);
            }
        }
  • 相关阅读:
    计算机基础 python基础内容 变量以及基础数据类型
    初识函数--生成器
    初识函数--迭代器
    初识函数
    初识小数据池和深浅拷贝
    初识基础数据类型 dict,set
    初识基础数据类型 list,tuple
    初识基础数据类型 int,str,bool
    初识变量
    自定义协议解决粘包问题,阿里云部署,udp协议套接字,socketserver模块的使用
  • 原文地址:https://www.cnblogs.com/fws94/p/8183360.html
Copyright © 2011-2022 走看看