判断Socketl连接是否断开

在 Android socket 编程中我们需要时刻对其网络状态进行判断,android对网络状态判断的方法(isClosed(),isConnected(),isInputShutdown(),sOutputShutdown())中都是判断本地socket端的状态的,无法判断远端的socket状态,则可通过隔段时间向对方发送数据,如果发送过程出现异常,则证明网络出现问题。

1.使用 sendUrgentData方法,需要设置远端socket属性setOOBInline(true)

public boolean sendHeartBeat() {
		try {
			mSocket.sendUrgentData(0xFF);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
2.通过发送TCP消息

public synchronized boolean sendHttpMsg(HttpMsg msg){
		try {
			msg.writeTo(mOutputStream);
			mOutputStream.flush();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
3.以上两种方法貌似还可以使用,但是有种情况也是无效的,例如:对方单方向断网(拔掉网线)。这种情况下就需要其他方法判断了,可以使用Linux下的ping命令,这是目前最有效的网络状态判定,也是比较准确的方法。
public boolean startPing(){
		boolean success=false;
		Process p =null;
		try {
			p = Runtime.getRuntime().exec("ping -c 3 -i 1 -W 5 " +BOX_IP_ADDRESS); //-c次数 -i间隔 -W超时
			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;
	}
这种方法会造成程序卡顿

4.采用服务器定时发送心跳包,客户端检测超时

mSocket.setSoTimeout(20000);

弊端是会增加通信消耗。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值