Fermer correctement SSLSocket

Je veux mettre en œuvre un proxy SSL en Java. En gros, j'ai ouvert deux sockets browser-proxy,proxy-server, et d'exécuter deux threads qui écrirait à proxy-server ce qu'ils ont lu à partir de browser-proxy, et vice versa. Chaque thread ressemble à ceci:

while (true) {
   nr = in.read(buffer);
   if (nr == -1) System.out.println(sockin.toString()+" EOF  "+nr);
   if (nr == -1) break;
   out.write(buffer, 0, nr);
}
sockin.shutdownInput();
sockout.shutdownOutput(); //now the second thread will receive -1 on read

Chaque thread ne fermer la prise d'entrée, de sorte que finalement les deux sockets sont fermés.

Mais que dois-je faire si je veux utiliser un SSLSocket? Il semble que la shutdownOutput/Input méthodes ne sont pas pris en charge. Voici l'exception que je reçois.

Exception in thread "Thread-35" java.lang.UnsupportedOperationException: \
The method shutdownInput() is not supported in SSLSocket
    at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.shutdownInput(Unknown Source)

Ce que j'ai trouvé est:

try {
    while (true) {
       nr = in.read(buffer);
       if (nr == -1) System.out.println(sockin.toString()+" EOF  "+nr);
       if (nr == -1) break;
       out.write(buffer, 0, nr);
    }
    //possible race condition if by some mysterious way both threads would get EOF
    if (!sockin.isClosed()) sockin.close();
    if (!sockout.isClosed()) sockout.close();
} catch (SocketException e) {/*ignore expected "socket closed" exception, */}

Je dois les attraper et de les ignorer fin de l'exception socket à chaque fois que mon socket se termine.

Mes questions sont:

  1. Si shutdownInput() est pas pris en charge, comment ça se fait que je suis un -1 la réponse d'un SSLSocket.
  2. Est-il une meilleure solution pour mon agonie? Je ne pense pas qu'il y a quelque chose de sain d'esprit, car le thread peut être déjà dans le blocage read méthode lorsque les autres marques de filetage lui "je suis fait". Et le seul moyen que je vois pour l'expulser du blocage du thread est par la fermeture de la socket et l'éducation d'un "socket fermée" exception.

    (Je suppose que vous pourriez utiliser certains impie combinaison de multithread de passage de messages et de données asynchrone lecture pour signaler à l'autre fil de votre travail est fait, mais c'est tellement horrible que j'ai peur de l'Ide du style cop veut venir après moi, juste pour y penser...)

Précisions: je sais que shutdownInput et shutdownOutput n'a pas de sens, puisque vous ne pouvez pas avoir un half-duplex connexion TLS, par spec. Mais, comment puis-je mettre fin à une connexion TLS en Java sans se faire une exception?

S'il vous plaît, ne me dites pas shutdownIput ne fait pas de sens pour TLS. Je sais que, ce n'est pas ce que je demande à. Je me demande ce que je peux utiliser, dans l'ordre de fermer SSLSocket correctement (d'où le titre, "fermer Correctement SSLSocket".

Que voulez-vous dire quand vous dites shutdownInput/Sortie n'est pas pris en charge? La méthode lève une exception? Si oui, quel exception?
Oui, en effet, elle déclenche une exception Exception in thread "Thread-4" java.lang.UnsupportedOperationException: The method shutdownInput() is not supported in SSLSocket. J'ai supposé que le un bien suffisant pour répondre à ma question, déjà savons pour un fait qui n'est pas pris en charge avec SSL.
Pourriez-vous préciser pourquoi "maintenant, le deuxième thread va recevoir -1 sur "lire" à sockout.shutdownOutput()? Sans doute, dans votre exemple, in = sockin.getInputStream().
désolé pour le retard. Comme je l'ai mis en œuvre, il y a deux fils, l'un de lecture à partir de s et écrit ce qu'il a obtenu à t, et de l'autre la lecture de t et de l'écriture à s. Lorsque s retourne EOF, c'est à dire read -> -1, je ferme (le flux de sortie d') socket t, et par la fermeture, je suis en fait ce qui implique EOF ont atteint. La prochaine read de t doit retourner -1 de signal EOF. (et merci beaucoup pour revenir à ce fil)
Je dirais que, dans votre exemple, sockin.shutdownInput() est sans doute inutile puisque les expressions du FOLKLORE a déjà été reçues de toute façon. (C'est plus habituel à l'arrêt de la sortie de la première). N'avez-vous pas obtenir une simultanéité problème, même dans votre plaine TCP exemple? Disons que vous arrêter de lire à partir de sockIn, mais encore de données à lire à partir de sockOut. En appelant sockIn.close() presque immédiatement après l'arrêt de la lecture, vous perdez la possibilité d'écrire ce qui peut toujours être lu à partir de sockOut.

OriginalL'auteur Elazar Leibovich | 2011-06-21