web-dev-qa-db-fra.com

Vérifier si le serveur est en ligne à partir de Java code

Je veux vérifier si l'application serveur est disponible. Une fois le serveur démarré, je veux arrêter de vérifier jusqu'à ce que le serveur change d'état. Comment faire cela avec mon code:

 private static final String SERVER_ADDRESS = "192.144.10.10";
    private static final int TCP_SERVER_PORT = 8890;
    private static boolean connected = false;
    static Socket s;

    public static void main(String[] args) {

    Timer timer = new Timer();
    timer.schedule(task, 01, 5001); }  

static TimerTask task = new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (connected == false)
            {
            System.out.println(hostAvailabilityCheck());
            }
        }
    };

    public static boolean hostAvailabilityCheck()
    { 

        boolean available = true; 
        try {               
            if (connected == false)
            { (s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)).close();    
            }               
            } 
        catch (UnknownHostException e) 
            { // unknown Host 
            available = false;
            s = null;
            } 
        catch (IOException e) { // io exception, service probably not running 
            available = false;
            s = null;
            } 
        catch (NullPointerException e) {
            available = false;
            s=null;
        }


        return available;   
    } 

Y a-t-il une meilleure façon de résoudre ce problème?

19
Josef

La méthode de vérification peut être réécrite comme suit (Java 7 et versions ultérieures):

public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) {
        return true;
    } catch (IOException ex) {
        /* ignore */
    }
    return false;
}

En plus de simplifier la gestion des exceptions, cela élimine une fuite embêtante de Socket. (Si vous êtes préoccupé par le temps nécessaire pour effectuer cette vérification, définissez un délai d'expiration de connexion avant de tenter de vous connecter: voir Définition d'un délai d'expiration pour les opérations de socket )

Mais les problèmes avec cette approche sont multiples:

  • Il teste uniquement que quelque chose écoute les connexions. Si votre service est derrière un proxy ... ou est géré par quelque chose comme le service inetd ... alors les connexions acceptées ne signifient pas que votre service fonctionne réellement.

  • Cela va amener votre service à "voir" les connexions qui se ferment sans envoyer de demande. Donc, vous feriez mieux de coder votre service pour gérer ce problème "gracieusement".

  • Faire cela à plusieurs reprises augmente la charge du réseau et du serveur.

  • Si vous définissez un court délai d'attente parce que vous ne voulez pas que le test "se fige", vous risquez de le définir trop court et de juger l'hôte comme étant inactif lorsqu'il ne l'est pas.


Après le démarrage du serveur, je veux arrêter de vérifier jusqu'à ce que le serveur change d'état

C'est presque impossible. La raison en est que vous ne pourrez pas dire si le serveur a "changé d'état" sans vérifier. Ou au moins, vous ne pourrez pas le faire sans implémenter un service de notification d'état élaboré où le serveur appelle le client pour lui dire qu'il change d'état . (Et si "changer le statut" inclut "mourir" ou "connexion réseau perdue", alors vous ne pourrez pas rendre cette notification fiable .. . le cas échéant.)

25
Stephen C

Vérifiez d'abord si le serveur fonctionne et que le serveur accepte la connexion.

   public static boolean hostAvailabilityCheck()
{ 
    s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);
    boolean available = true; 
    try {               
        if (s.isConnected())
        { s.close();    
        }               
        } 
    catch (UnknownHostException e) 
        { // unknown Host 
        available = false;
        s = null;
        } 
    catch (IOException e) { // io exception, service probably not running 
        available = false;
        s = null;
        } 
    catch (NullPointerException e) {
        available = false;
        s=null;
    }


    return available;   
} 
4
Murali
public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) {
        return true;
    } catch (IOException ex) {
        /* ignore */
    }
    return false;
}

fonctionne, mais le problème est que lorsque vous allumez le téléphone via le WI-FI, cela se termine par un "arrêt strident" et aucune action. pour la pensée ... =)

le prochain code sera de travailler via WI-FI ... si vous augmentez le temps de connexion -

public static boolean isOnline() {
    boolean b = true;
    try{
        InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT);
        Socket ss = new Socket();
        ss.connect(sa, 1);            --> change from 1 to 500 (for example)
        ss.close();
    }catch(Exception e) {
        b = false;
    }
    return b;
}
3
Viktor XXL