在 android socket 编程中我们需要时刻对其网络状态进行判断,android(java)对网络状态判断的方法(isClosed(),isConnected(),isInputShutdown(),sOutputShutdown())中,并没有有效方法,这些都是判断本地socket端的状态的,如果要判断远端的socket状态,则可通过隔段时间向对方发送数据,如果发送过程出现异常,则证明网络出现问题。
相关方法如下:
方法一: try { socket.sendUrgentData(0xFF); } catch (IOException e) { //网络断开 handleNetDisconnect(); e.printStackTrace(); }
方法二:
/** * 通过tcp发送信息 * @param str */ private boolean sendMsg(String str){ boolean isConnect=false; if(dos!=null) try { dos.write(str.getBytes("UTF-8")); dos.flush(); isConnect=true; } catch (IOException e) { Log.e("tcpmsg", "writeOutputStream fail"); isConnect=false; } return isConnect; }
以上两种方法貌似还可以使用,但是有种情况也是无效的,例如:对方单方向断网(拔掉网线)。这种情况下就需要其他方法判断了,我们可以使用类似于windows下的Ping命令,来使用Linux下的ping命令,这是目前最有效的网络状态判定,也是比较准确的方法。
android中ping方法:
private boolean startPing(String ip){ Log.e("Ping", "startPing..."); boolean success=false; Process p =null; try { p = Runtime.getRuntime().exec("ping -c 1 -i 0.2 -W 1 " +ip); int status = p.waitFor(); if (status == 0) { success=true; } else { success=false; } } catch (IOException e) { success=false; } catch (InterruptedException e) { success=false; }finally{ p.destroy(); } return success; }
其中 -c 1为发送的次数,1为表示发送1次,-w 表示发送后等待响应的时间。
通过以上代码可以实现对某个ip的测试,测试时需要使用真机。