Question

J'écris un serveur de réseau en Java et j'ai un petit problème avec elle. Laissez le code parler:

import java.io.IOException;
import java.net.ServerSocket;
/**
* Another flavor of the server module.
* According to GOD (also known as Joshua Bloch) this is the proper
* implementation of a singleton (Note: serialization).
* 
* @author estol
*/
public enum EnumSingletonServer implements ServerInterface, Runnable
{
    SERVER;
    private ServerSocket serverSocket = null;
    private boolean Listening         = true;

    @Override
    public void bind() {
        this.bind(DEFAULTPORT);
    }

    @Override
    public void bind(int Port) {
        try {
            this.serverSocket = new ServerSocket(Port);
        } catch (IOException ioe) {
            System.err.printf("Cannot bind to port %d\nAdditional information:\n%s\nExiting\n", Port, ioe.getMessage());
            System.exit(1);
        }
    }

    /**
    * Not that elegant, but does not work with flipping the switch, because
    * the loop (in public void run()) is only running when there is an incoming connection(?).
    * 
    * 
    * FIXME
    */
    @Override
    public void shutdown() {
        // this.Listening = !this.Listening; // FIXME
        System.exit(0);

    }
    /**
    * Accepting connections on the port, we are bound to.
    * The main loop of the server is a bit broken. Does not exit,
    * if we flip the value of this.Listening, but exit on the next incoming
    * connection. This is a problem.
    * 
    * FIXME
    */
    @Override
    public void run() {
        try {
            System.out.printf("Listening on %d\n", this.serverSocket.getLocalPort());
            Thread.currentThread().setName("ServerThread");
            // FIXME
            do {
                new Thread(new ServerWorkerThreads(this.serverSocket.accept(), 3)).start();
            } while (this.Listening);

            this.serverSocket.close();
            System.exit(0);
        } catch (IOException ioe) {
            System.err.printf("Cannot accept on, or close port %d\nAdditional information:\n%s\nExiting\n", this.serverSocket.getLocalPort(), ioe.getMessage());
            System.exit(1);
        }
    }
}

Maintenant, comme indiqué dans les commentaires, si je nie / retournez / changez la valeur de la variable, la boucle ne s'arrête pas, mais sort sur la connexion suivante.

Je n'ai pas implémenté le serveur dans un énumérateur au témérateur, je l'ai fait avec une classe, qui n'a pas réussi à être un singleton après avoir été sérialisé, mais cela a été exécuté comme je m'attendais à ce que ce soit.J'ai essayé un moment (condition) terminé, ainsi que la boucle (condition).

Toute aide serait appréciée.

Était-ce utile?

La solution

Dans votre méthode d'arrêt, fermez simplement la prise au lieu de régler la variable:

this.serverSocket.close()

Ceci augmentera une SocketException sur la boucle d'acceptation et la boucle va s'arrêter.

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