2012-10-12 60 views
8

Todas las fuentes/muestras en Internet que está disponible en NIO2 están sin soporte TLS/SSL,Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel y TLS/SSL

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

Según entiendo el ciclo de vida SSLEngine de la conexión difieren de AsynchronousSocketChannel.connect & & AsynchronousServerSocketChanne.accept, TLS/SSL debe estar encapsulado dentro de la implementación de AIO, entonces, ¿cómo puedo usar ambos ...? NOTA: Yo por lo que en el proyecto del grisáceo un vídeo que habla de que ya ponerlo en práctica, miro en el código fuente, pero vi AIO pero no la integración de TLS/SSL ...

Gracias de antemano!

+0

El ciclo de vida de la conexión es el mismo: es solo una conexión. Sin embargo, la integración de SSLEngine con NIO no bloqueante es bastante difícil por otras razones, como tener que escribir cuando se supone que debes leer, y * viceversa, * y cómo manejar las tareas: no me apetece intentarlo con Async I/O. – EJP

+0

PD: ¿Acabo de notar la mala ortografía en mi comentario de recompensa, alguien sabe cómo editar esto? –

+0

Debo añadir a mi comentario que posteriormente implementé un AsyncSSLSocketChannel que usa SSLEngine. Como se predijo, no fue fácil. – EJP

Respuesta

3

El comentario sobre la pregunta original es realmente correcto. SSLEngine opera usando ByteBuffer directamente.

Esto significa que es compatible con AIO. Usted comienza aceptando una conexión. El cliente luego se conecta y realiza la escritura inicial. Para determinar si tiene suficientes datos almacenados en búfer, utilice handshake status y status. El motor seguirá diciéndole "NEED_UNWRAP" si es necesario suministrar más datos desde el otro extremo. Por lo tanto, debe mantener una cola de objetos ByteBuffer. Lo mismo, el motor seguirá diciéndole "NEED_WRAP" si se deben enviar más datos al otro extremo antes de que pueda continuar. Sigues adelante hasta que termines del estado de handshake.

Sin embargo, recomendaría utilizar algo como Netty, que hace que esto sea mucho más simple. Cabe señalar que Netty sí tenía soporte para AIO en las etapas alfa de 4. Sin embargo, se demostró que AIO era más lento que NIO. Por lo tanto, fue eliminado.

Sin embargo, Netty no solo hará las cosas más simples que tratar de usar NIO o AIO directamente, sino que también hará que sea fácil cambiar entre las dos si alguna vez se reintroduce AIO.

Se puede encontrar un ejemplo completo del uso de SSL con Netty here.

+0

gracias por su entrada, debo señalar que sé cómo usar SSLEngine y tengo una implementación que funciona con nio tradicional. La versión AIO, sin embargo, lucho por darle forma al código. En mi caso, quería aprender cómo implementar una implementación eficiente de AIO haciendo mi propia implementación. (Solo necesito algunos consejos sobre diseño en términos de interbloqueos y la coordinación de los controladores de finalización durante el protocolo de enlace). –

+0

Echa un vistazo ahora a la versión anterior de netty con AIO para aclamaciones de los punteros. –

+0

Descubrirá que el código es el mismo. SSLHandler es un controlador de canalización y es idéntico sin importar si se usa con una fábrica de canal NIO o AIO https://github.com/netty/netty/blob/c149f4bcc0c0d02aa1abcd5e39c155a9e598822e/handler/src/main/java/io/netty/handler/ ssl/SslHandler.java – pjulien