我们都知道在游戏中会有实时网速监测。延迟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一下 就可以测试了。