Question

Je suis en train de mettre en œuvre une connexion serveur-client sur le spp.

Après l'initialisation du serveur, je commence un thread qui d'abord écoute pour les clients et reçoit ensuite les données de leur part. Il ressemble à ça:

public final void run() {
    while (alive) {
        try {
            /*
             * Await client connection
             */
            System.out.println("Awaiting client connection...");
            client = server.acceptAndOpen();

            /*
             * Start receiving data
             */
            int read;
            byte[] buffer = new byte[128];
            DataInputStream receive = client.openDataInputStream();
            try {
                while ((read = receive.read(buffer)) > 0) {
                    System.out.println("[Recieved]: "
                            + new String(buffer, 0, read));

                    if (!alive) {
                        return;
                    }
                }
            } finally {
                System.out.println("Closing connection...");
                receive.close();
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

Il fonctionne très bien car je suis en mesure de recevoir des messages. Qu'est-ce qui me trouble est comment le fil finira par mourir quand un appareil est hors de portée?

Tout d'abord, l'appel à des blocs de receive.read(buffer) de telle sorte que le thread jusqu'à ce qu'il reçoive les données. Si l'appareil est hors de portée, il ne serait jamais en avant de procéder pour vérifier si en attendant, il a été interrompu.

En second lieu, il n'y aurait jamais fermer la connexion, à savoir le serveur ne serait pas accepter l'appareil une fois qu'il retourne dans la gamme.

Était-ce utile?

La solution

Lorsque l'appareil distant est hors de portée, après le délai de surveillance de lien expire, la pile locale doit fermer la connexion. En fonction de la mise en œuvre JSR-82, receive.read(buffer) retournera -1 ou lancera une IOException. Vous pouvez simuler cela en éteignant l'appareil à distance ou en le déplaçant hors de portée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top