2010-12-02 7 views
3

J'écris un programme serveur en utilisant Java SocketChannel non bloquant. Parfois, je veux envoyer un message de réponse, puis fermez le canal, comme le code suivant.Comment fermer correctement un canal de socket non bloquant?

Cependant, la méthode close() interrompt la méthode write(), j'obtiens une exception java.nio.channels.ClosedChannelException et le message n'est pas envoyé.

Je peux faire apparaître un thread et attendre 1 à 2 secondes avant de fermer le canal, mais je pense qu'il est inutile de faire un autre thread.

Quelle est la bonne façon de fermer un SocketChannel alors qu'il y a des opérations en attente?

String msg = "Wrong password!"; 
channel.write(ByteBuffer.wrap(msg.getBytes())); 
channel.close(); 
+0

Cela ne semble pas correct. Vous devez être en train d'écrire * après * avoir fermé la chaîne. J'ai des kilomètres de code comme ça et ça ne fait pas ça. – EJP

Répondre

-1

canal. socket(). setSoLinger (true, MAX_SECONDS_FOR_OUTPUT_TO_DRAIN);

Voir info sur le linger option. Comme mentionné, il provoquera le blocage de close() jusqu'à MAX_SECONDS_FOR_OUTPUT_TO_DRAIN secondes.

+1

ne semble pas fonctionner pour moi, peut-être juste pour bloquer la prise? – Hongbo

+0

Il ne fera que cela en mode de blocage, où il est fondamentalement inutile en premier lieu. Il est en mode non bloquant. – EJP

Questions connexes