2009-11-11 13 views
0

Je tente d'implémenter une application client avec une connexion asynchrone. Je veux savoir si je peux réutiliser un objet SocketChannel après qu'il a échoué à se connecter à un serveur.réutilisation des canaux de socket

SocketChannel channel = SocketChannel.open(); 
    channel.configureBlocking(false); 
    InetSocketAddress addr = new InetSocketAddress(host, port); 
    SelectionKey key = channel.register(select, SelectionKey.OP_READ, connection); 
    channel.connect(addr); 

après est la boucle select, mon socket se éventuellement choisi parce que la connexion a échoué. Je voudrais mettre en file d'attente une autre tentative de connexion sur ce canal, et rien de ce que je fais ne semble le faire. la méthode channel.isConnectionPending() renvoie toujours vrai (même si j'essaie de terminerConnect)

est la seule solution se débarrasser de ce SocketChannel et en créer un nouveau?

Répondre

1

Sun a publié les sources Java 6.0 sous licence GPL. "Read the source Luke"

Et ma lecture du code est que vous ne pouvez pas appeler connecter une seconde fois.

+0

ouais il semble qu'une fois que l'état atteint en attente il n'y a pas d'instructions pour le renvoyer à déconnecté. – aepurniet

0

Hmmm ... Je ne suis pas un expert de NIO mais quelque chose semble louche. Vous vous enregistrez pour OP_ACCEPT, ce qui se produit lorsqu'un canal d'écoute reçoit une connexion entrante - cependant, vous utilisez le canal pour une connexion sortante.

Vous devriez poster plus du code, y compris la boucle de sélection.

+0

ahh désolé, copier et coller d'un autre procédé dans le code fixe. – aepurniet

+0

ill poster plus de code, mais la question est assez spécifique, puis-je appeler connecter sur un canal de socket deux fois. Tout le code dans le monde ne va pas apporter plus de lumière à ce sujet. (bien à part le code sdk, hmmm ...) – aepurniet

0

L'essayer et voir?

Je ne suis pas sûr à 100%, mais je pense que vous pouvez une fois finishConnect a été appelé et est retourné ou une exception, il peut être jeté ok.

Mettez un bloc try/catch autour de la connexion et lorsque l'exception est interceptée vous pouvez être sûr d'appeler à nouveau la méthode channel.connect.

Si cela ne fonctionne pas alors la réponse est probablement pas.