2012-10-12 13 views
8

Alle Quellen/samples im Internet, die auf NIO2 sind ohne TLS/SSL-Unterstützung verfügbarJava NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel und TLS/SSL

java.nio.channels.AsynchronousSocketChannel java.nio.channels.AsynchronousServerSocketChannel

Als ich das SSLEngine Lebenszyklus verstehen der Verbindung unterscheidet sich von AsynchronousSocketChannel.connect & & AsynchronousServerSocketChanne.accept, TLS/SSL sollte innerhalb der AIO-Implementierung gekapselt werden, also wie kann ich sie beide ... verwenden? HINWEIS: Ich so im Grizzly Projekt ein Video, das über sie reden schon umzusetzen, ich auf den Quellcode schauen, aber ich sah AIO aber nicht TLS/SSL-Integration ...

Vielen Dank im Voraus!

+0

Der Lebenszyklus der Verbindung ist der gleiche: es ist nur eine Verbindung. Die Integration der SSLE-Engine mit nicht-blockierendem NIO ist jedoch aus anderen Gründen schwierig, wie zum Beispiel, wenn man schreiben soll, wenn man lesen soll, und * umgekehrt * und wie man mit den Aufgaben umgeht: Ich will es nicht versuchen mit Async-E/A. – EJP

+0

PS: Gerade bemerkt die schlechte Schreibweise auf meinem Kopfgeld Kommentar, weiß jemand, wie man das bearbeitet? –

+0

Ich sollte meinem Kommentar hinzufügen, dass ich anschließend einen AsyncSSLSocketChannel implementiert habe, der die SSLE-Engine verwendet. Wie vorhergesagt, war es nicht einfach. – EJP

Antwort

3

Der Kommentar zu der ursprünglichen Frage ist in der Tat richtig. SSLEngine arbeitet mit ByteBuffer direkt.

Dies bedeutet, dass es mit AIO kompatibel ist. Sie beginnen mit dem Akzeptieren einer Verbindung. Der Client verbindet sich dann und führt das anfängliche Schreiben durch. Um festzustellen, ob Sie genügend Daten gepuffert haben, verwenden Sie handshake status und status. Die Engine wird Ihnen weiterhin "NEED_UNWRAP" sagen, wenn am anderen Ende mehr Daten bereitgestellt werden müssen. Sie müssen also eine Reihe von ByteBuffer-Objekten behalten. Gleiches gilt für die Engine, die Ihnen "NEED_WRAP" sagt, wenn mehr Daten an das andere Ende gesendet werden müssen, bevor es fortgesetzt werden kann. Du gehst weiter, bis du aus dem Handshake-Status "Beendet" erhältst.

Ich würde empfehlen, aber Sie verwenden etwas wie netty, die das viel einfacher macht. Es sollte beachtet werden, dass Netty Unterstützung für AIO in den Alpha-Stufen von 4 hatte. Es wurde jedoch gezeigt, dass AIO langsamer war als NIO. Daher wurde es entfernt.

Aber nicht nur, dass Netty die Dinge einfacher macht, als zu versuchen, NIO oder AIO direkt zu verwenden, sondern macht es auch leicht, zwischen den beiden zu wechseln, wenn AIO jemals wieder eingeführt wird.

Ein vollständiges Beispiel für die Verwendung von SSL mit Netty finden Sie .

+0

danke für Ihre Eingabe, ich sollte darauf hingewiesen werden, dass ich weiß, wie man SSLEngine verwendet und eine Implementierung hat, die mit traditionellem nio arbeitet. Die AIO-Version, aber ich habe Mühe, den Code in irgendeiner Form zu gestalten. In meinem Fall wollte ich lernen, wie man eine effiziente AIO-Implementierung implementiert, indem ich meine eigenen rollen lasse. (Ich brauche nur ein paar Hinweise zum Design hinsichtlich Deadlocks und Koordination der Completion Handler während des Handshakes). –

+0

Werfen wir einen Blick auf die alte Version von netty mit AIO für Zeiger Prost. –

+0

Sie werden feststellen, dass der Code in der Tat gleich ist. SSLHandler ist ein Pipeline-Handler und ist identisch, egal ob er mit einer NIO- oder AIO-Kanal-Factory verwendet wird https://github.com/netty/netty/blob/c149f4bcc0c0d02aa1abcd5e39c155a9e598822e/handler/src/main/java/io/netty/handler/ ssl/SslHandler.java – pjulien