socket判断网络连接状态
2016-04-27 11:06
701 查看
在 Android socket 编程中我们需要时刻对其网络状态进行判断,android(java)对网络状态判断的方法(isClosed(),isConnected(),isInputShutdown(),sOutputShutdown())中,并没有有效方法,这些都是判断本地socket端的状态的,如果要判断远端的socket状态,则可通过隔段时间向对方发送数据,如果发送过程出现异常,则证明网络出现问题。
相关方法如下:
[java] view
plain copy
方法一:
try {
socket.sendUrgentData(0xFF);
} catch (IOException e) {
//网络断开
handleNetDisconnect();
e.printStackTrace();
}
方法二:
[java] view
plain copy
/**
* 通过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方法:
[java] view
plain copy
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的测试,测试时需要使用真机。
相关方法如下:
[java] view
plain copy
方法一:
try {
socket.sendUrgentData(0xFF);
} catch (IOException e) {
//网络断开
handleNetDisconnect();
e.printStackTrace();
}
方法二:
[java] view
plain copy
/**
* 通过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方法:
[java] view
plain copy
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的测试,测试时需要使用真机。
相关文章推荐
- Android OkHttp完全解析 是时候来了解OkHttp了
- 剖析OkHttp缓存机制
- HTTP请求头和响应头
- android从网络获取图片并显示
- HTTP的基本原理
- HTTP Keep-Alive是什么?如何工作?
- IDC机房网络测试要求
- 4月第3周网络安全报告:高危漏洞数量涨幅达94.1%
- http请求头与响应头剖析
- 网络安全
- 自己整理的OkHttp工具——留存用
- iOS开发网络篇—文件的上传
- Referenced file contains errors (http://struts.apache.org/dtds/struts-2.0.dtd)
- HTTP无状态协议和Connection:Keep-Alive容易犯的误区
- iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
- TCP/IP详解 卷一 ---------ARP地址解析协议
- 搭建本地yum源(http方式) on Red Hat Enterprise Linux Server
- OSI七层与TCP/IP五层网络架构详解
- 谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
- 网络存储