一、java socket 判断服务端已经断开连接或者被其他用于连接的方法,直接上代码。
public class Daemon_App_Thread extends Thread {
boolean host_reachable = false;
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(check_connect_status && CURRENT_CAMERA_STATUS == CAMERA_IDLE) {
host_reachable = Utils.sendPingRequest(ip_address, 2000);
try {
clientSocket.sendUrgentData(0xFF);//clientSocket.setKeepAlive(true);
} catch (IOException e) {
e.printStackTrace();
host_reachable = false;
Log.i(TAG, "The server may be used by other users or offline! "+e.toString());
}
if(!host_reachable){
Message msg = mHandler.obtainMessage();
msg.what = CONNECT_ERROR_CLOSE_SOCKET_MESSAGE;
msg.obj = "The server may be used by other users or offline!";
mHandler.sendMessage(msg);
check_connect_status = false;
}
}
}
}
}
public static boolean sendPingRequest(String ipAddress , int timeout_ms) {
try {
InetAddress geek = InetAddress.getByName(ipAddress);
if (geek.isReachable(timeout_ms))
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
二、上面代码用sendPingRequest来确认ping 服务端的ip是否可以屏得通,用sendUrgentData(0xFF)发心跳包。如果服务端的socket连接已经被其他用户中断,那么这个方法就会报错,就会执行到catch (IOException e)里面;在服务端断网情况下,sendUrgentData(0xFF)发心跳包照样也是可以,所以得用ping ip的方法确认服务端是否工作。
三、实际操作,当用户端自己断开网络时候,发sendUrgentData(0xFF)心跳包会失败,当服务端断开网络的时候,照样可以发sendUrgentData(0xFF)发心跳包。如果服务端被其他用户连接,发心跳包会失败。
四、参考文章
https://www.cnblogs.com/panchanggui/p/9664876.html?ivk_sa=1024320u
Android客户端Socket监听服务端是否断开连接的方法 - 简书
java中如何ping一个ip地址__花野的博客-CSDN博客
https://www.cnblogs.com/xyzlmn/archive/2011/01/17/3168198.html