我们都知道在游戏中会有实时网速监测。延迟XXms 这种

今天在Android 端也实现一下此功能,首先我们要知道网络延迟的几个等级

如何定义网络延迟程度:
(一般网络延迟PING值越低速度越快,但是速度与延迟没有必然联系)
1~30ms:极快,几乎察觉不出有延迟,玩任何游戏速度都特别顺畅
31~50ms:良好,可以正常游戏,没有明显的延迟情况
51~100ms:普通,对抗类游戏在一定水平以上能感觉出延迟,偶尔感觉到停顿
100ms~200ms:较差,无法正常游玩对抗类游戏,有明显卡顿,偶尔出现丢包和掉线现象
200ms~500ms:很差,访问网页有明显的延迟和卡顿,经常出现丢包或无法访问
>500ms:极差,难以接受的延迟和丢包,甚至无法访问网页
>1000ms:基本无法访问
计算方法:1秒=1000毫秒(例:30ms为0.03秒)

我们在程序当中用以下方法实现ping 命令

String delay = new String();
        Process p = null;
        String url= "www.baidu.com";                         //指向服务端地址
        try {
            p = Runtime.getRuntime().exec("ping -c 4 " +url);//PING 该地址 4次
            BufferedReader buf = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String str = new String();

            while ((str = buf.readLine()) != null) {
                if (str.contains("avg")) {
                    int i = str.indexOf("/", 20);
                    int j = str.indexOf(".", i);
                    System.out.println("--->str:" + str);
                    delay = str.substring(i + 1, j);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

通过ping命令可以获得到 移动到的网络延迟具体数值

   private final String TAG = this.getClass().getSimpleName();
    private Handler handler;
    private Runnable runnable;
    private Button btnPing;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_net);
        EventBus.getDefault().register(this);  //事件的注册
        btnPing = findViewById(R.id.btn_ping);

        handler = new Handler();
        runnable = new Runnable() {
            public void run() {
                ping();
                handler.postDelayed(this, 3000);
            }
        };

        Button ks = findViewById(R.id.ks);
        //开始
        ks.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                handler.postDelayed(runnable, 3000); // 开始Timer
            }
        });
        Button tz = findViewById(R.id.tz);
        //停止
        tz.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                handler.removeCallbacks(runnable); //停止Timer
            }
        });
    }
    // 普通事件的处理
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void handleEvent(EventBusCarrier carrier) {
        NetBean content = (NetBean) carrier.getObject();
        btnPing.setText(content.toString());
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this); //解除注册
        super.onDestroy();
    }

    private void ping() {
        String delay = new String();
        Process p = null;
        String url= "www.baidu.com";                        //指向服务端IP
        try {
            p = Runtime.getRuntime().exec("ping -c 4 " +url);//PING 该地址 4次
            BufferedReader buf = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String str = new String();
            while ((str = buf.readLine()) != null) {
                if (str.contains("avg")) {
                    int i = str.indexOf("/", 20);
                    int j = str.indexOf(".", i);
                    System.out.println("--->str:" + str);
                    delay = str.substring(i + 1, j);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        String state = "普通";
        if (delay != null && !TextUtils.isEmpty(delay)) {
            int lag = Integer.parseInt(delay);
            if (0 < lag && lag < 30) {            // 1~30ms:极快,几乎察觉不出有延迟,玩任何游戏速度都特别顺畅
                state = "极快";
            } else if (30 <= lag && lag < 50) {     // 31~50ms:良好,可以正常游戏,没有明显的延迟情况
                state = "良好";
            } else if (50 <= lag && lag < 100) {    // 51~100ms:普通,对抗类游戏在一定水平以上能感觉出延迟,偶尔感觉到停顿
                state = "普通";
            } else if (100 <= lag && lag < 200) {   // 100ms~200ms:较差,无法正常游玩对抗类游戏,有明显卡顿,偶尔出现丢包和掉线现象
                state = "较差";
            } else if (200 <= lag && lag < 500) {   // 200ms~500ms:很差,访问网页有明显的延迟和卡顿,经常出现丢包或无法访问
                state = "很差";
            } else if (500 <= lag && lag < 1000) {  // >500ms:极差,难以接受的延迟和丢包,甚至无法访问网页
                state = "极差";
            } else {                       // >1000ms:基本无法访问
                state = "无法访问";
            }

            NetBean netBean = new NetBean(lag, state);
            EventBusCarrier eventBusCarrier = new EventBusCarrier();
            eventBusCarrier.setEventType("1");
            eventBusCarrier.setObject(netBean);
            EventBus.getDefault().post(eventBusCarrier);
        } else {
            NetBean netBean = new NetBean(-1, "无网络连接");
            EventBusCarrier eventBusCarrier = new EventBusCarrier();
            eventBusCarrier.setEventType("1");
            eventBusCarrier.setObject(netBean);
            EventBus.getDefault().post(eventBusCarrier);
        }
   }
}

布局文件 activity_net.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_ping"
        android:text="Ping"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/ks"
        android:text="start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/tz"
        android:text="stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

引入  implementation 'org.greenrobot:eventbus:3.0.0'

//网络对象
public class NetBean {
    private int lag;//延迟
    private String name;//名称
    public NetBean(int lag, String name) {
        this.lag = lag;
        this.name = name;
    }
    public int getLag() {
        return lag;
    }
    public void setLag(int lag) {
        this.lag = lag;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "NetBean{" +
                "lag=" + lag +
                ", name='" + name + '\'' +
                '}';
    }
}
//EventBus 事件转发
public class EventBusCarrier {
    private String eventType; //区分事件的类型
    private Object object;  //事件的实体类
    public String getEventType() {
        return eventType;
    }
    public void setEventType(String eventType) {
        this.eventType = eventType;
    }
    public Object getObject() {
        return object;
    }
    public void setObject(Object object) {
        this.object = object;
    }
}

最后build一下 就可以测试了。

11-27 13:40