Comment puis-je vous interrompre un ServerSocket méthode accept ()?
Dans mon thread principal, j'ai un while(listening)
boucle qui appelle accept()
sur mon ServerSocket objet, puis démarre un nouveau thread client et l'ajoute à une Collection lorsqu'un nouveau client est acceptée.
J'ai aussi un Admin fil que je veux utiliser pour émettre des commandes, à l'instar de "sortie", qui sera la cause de tous les threads de client-être arrêter, arrête de lui-même, et de fermer le thread principal, en tournant à l'écoute pour de faux.
Cependant, la accept()
appel dans le while(listening)
boucle de blocs, et il ne semble pas être un moyen de les interrompre, de sorte que le bien que la condition ne peut être vérifiée de nouveau, et le programme ne peut pas sortir!
Est-il une meilleure façon de le faire? Ou d'une certaine façon à interrompre le blocage de la méthode?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez appeler
close()
partir d'un autre thread, et leaccept()
appel jeter unexception socketexception
.close()
, je veux dire qu'il va jeter l'exception de le faire, donc est-il un autre moyen (ce qui ne veut pas jeter l'exception, pas basé sur timeout) pour arrêter l'écoute des demandes?readLine()
sera alors retourner la valeur null et la normale fermeture des opérations que le thread devrait déjà être en place, va se produire.Set timeout sur
accept()
, l'appel expire le blocage après un certain temps:http://docs.oracle.com/javase/7/docs/api/java/net/SocketOptions.html#SO_TIMEOUT
Appelle
close()
sur leServerSocket
une option?http://java.sun.com/j2se/6/docs/api/java/net/ServerSocket.html#close%28%29
Il vous suffit de créer "void" prise pour briser serversocket.accept()
Côté serveur
Méthode pour casser serveur cycle
La raison
ServerSocket.close()
jette un exceptionc'est parce que vous avez un
outputstream
ou uninputstream
attaché à cette prise.
Vous pouvez éviter cette exception en toute sécurité en fermant d'abord l'entrée et les flux de sortie.
Ensuite, essayez de fermer le
ServerSocket
.Voici un exemple:
Vous pouvez appeler cette méthode pour fermer un socket à partir de n'importe où sans recevoir une exception.
ServerSocket
mais à unSocket
et nous parlons de la fermeture de laServerSocket
pas leSocket
, de sorte que leServerSocket
peut être fermé sans la fermeture d'unSocket
's ruisseaux.Utilisation serverSocket.setSoTimeout(timeoutInMillis).
Une autre chose que vous pouvez essayer qui est plus propre, est de vérifier un drapeau dans le accepter la boucle, et puis quand votre admin thread veut tuer le thread se bloque lors de l'accepter, de définir l'indicateur (il est thread-safe) et ensuite faire un socket client de la socket d'écoute.
L'acceptez sera de blocage et retour le nouveau socket.
Vous pouvez travailler sur un simple protocole de chose à raconter le thread d'écoute pour quitter le fil proprement.
Et puis fermez la prise sur le côté client.
Pas d'exceptions, beaucoup plus propre.
OK, j'ai eu ce travail d'une manière que les adresses de l'OP est question plus directement.
Garder la lecture passé, la réponse la plus courte pour un Thread exemple de la façon dont je l'utilise.
Réponse courte:
Monde réel exemple:
Dans cet exemple, j'ai un ServerSocket d'attente pour une connexion à l'intérieur du Fil. Lorsque je ferme l'appli, je veux arrêter le thread (plus précisément, la prise) d'une façon propre avant de me laisser l'application fermer, donc j'utilise la .setSoTimeout() sur le ServerSocket puis-je utiliser l'interruption est levée après le délai d'attente pour vérifier et voir si le parent est en train d'essayer d'arrêter le fil. Si oui, puis j'ai mis de fermer le socket, puis définir un indicateur qui indique que le thread est fait, puis-je sortir d'entre les Fils de la boucle qui renvoie une valeur null.
Puis, dans ma classe de Contrôleur ... (je ne montre que le code pertinent, de massage dans votre propre code en fonction des besoins)
J'espère que cela aide quelqu'un en bas de la route.