2023-03-10 java socket 判断服务端已经断开连接或者被其他用户连接的方法,用sendUrgentData(0xFF)发心跳包和ping ip两者结合

一、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

Java中Socket上的Read操作阻塞问题_fw0124的博客-CSDN博客

Java Socket通过读取数据阻塞的解决方案 - 简书

猜你喜欢

转载自blog.csdn.net/qq_37858386/article/details/129441055