unity ping 一个服务器 ip 的工具类

最近公司需要对服务器进行速度侦测,而不依赖于服务器返回的时间戳,所以需要使用 unity 自带的 ping 类。

这里提供一个现成的工具类:

using UnityEngine;
using System.Collections;

public class UnityPing : MonoBehaviour
{
    private static string s_ip = "";
    private static System.Action<int> s_callback = null;

    private static UnityPing s_unityPing = null;

    private static int s_timeout = 2;

    public static void CreatePing(string ip, System.Action<int> callback)
    {
        if (string.IsNullOrEmpty(ip)) return;
        if (callback == null) return;
        if (s_unityPing != null) return;

        s_ip = ip;
        s_callback = callback;

        GameObject go = new GameObject("UnityPing");
        DontDestroyOnLoad(go);
        s_unityPing = go.AddComponent<UnityPing>();
    }

    /// <summary>
    /// 超时时间(单位秒)
    /// </summary>
    public static int Timeout
    {
        set
        {
            if (value > 0)
            {
                s_timeout = value;
            }
        }
        get { return s_timeout; }
    }


    private void Start()
    {
        switch (Application.internetReachability)
        {
            case NetworkReachability.ReachableViaCarrierDataNetwork: // 3G/4G
            case NetworkReachability.ReachableViaLocalAreaNetwork: // WIFI
                {
                    StopCoroutine(this.PingConnect());
                    StartCoroutine(this.PingConnect());
                }
                break;
            case NetworkReachability.NotReachable: // 网络不可用
            default:
                {
                    if (s_callback != null)
                    {
                        s_callback(-1);
                        Destroy(this.gameObject);
                    }
                }
                break;
        }
    }

    private void OnDestroy()
    {
        s_ip = "";
        s_timeout = 20;
        s_callback = null;

        if (s_unityPing != null)
        {
            s_unityPing = null;
        }
    }

    IEnumerator PingConnect()
    {
        // Ping網站 
        Ping ping = new Ping(s_ip);

        int addTime = 0;
        int requestCount = s_timeout * 10; // 0.1秒 请求 1 次,所以请求次数是 n秒 x 10

        // 等待请求返回
        while (!ping.isDone)
        {
            yield return new WaitForSeconds(0.1f);

            // 链接失败
            if (addTime > requestCount)
            {
                addTime = 0;

                if (s_callback != null)
                {
                    s_callback(ping.time);
                    Destroy(this.gameObject);
                }
                yield break;
            }
            addTime++;
        }

        // 链接成功
        if (ping.isDone)
        {
            if (s_callback != null)
            {
                s_callback(ping.time);
                Destroy(this.gameObject);
            }
            yield return null;
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值