2012-10-12 22 views
8

wszystkie źródła/próbki w Internecie, które dostępne są na NIO2 są bez wsparcia TLS/SSL,Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel i TLS/SSL

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

Jak rozumiem cykl SSLEngine połączenia różnią się od AsynchronousSocketChannel.connect & & AsynchronousServerSocketChanne.accept, TLS/SSL powinien być zamknięty wewnątrz implementacji AIO, więc w jaki sposób mogę użyć ich obu ...? UWAGA: I tak w projekcie Grizzly film, który już mówić o jego realizacji, patrzę na kodzie źródłowym, ale widziałem AIO ale nie integracja TLS/SSL ...

Z góry dzięki!

+0

Cykl życia połączenia jest taki sam: jest to tylko połączenie. Jednak integracja SSLEngine z non-blocking NIO jest wystarczająco trudna z innych powodów, takich jak pisanie, kiedy powinieneś czytać, i * vice versa, * i jak radzić sobie z zadaniami: nie lubię próbować tego z Asynchronicznymi I/O. – EJP

+0

PS: Właśnie zauważyłem złą pisownię w moim komentarzu do nagrody, czy ktoś wie, jak to zmienić? –

+0

Powinienem dodać do mojej uwagi, że później zaimplementowałem AsyncSSLSocketChannel, który używa SSLEngine. Zgodnie z przewidywaniami nie było to łatwe. – EJP

Odpowiedz

3

Komentarz na temat pierwotnego pytania jest rzeczywiście poprawny. SSLEngine działa bezpośrednio przy użyciu ByteBuffer.

Oznacza to, że jest zgodny z AIO. Zaczynasz od zaakceptowania połączenia. Następnie klient łączy się i wykonuje wstępny zapis. Aby ustalić, czy masz wystarczającą ilość buforowanych danych, użyj handshake status i status. Silnik będzie nadal wyświetlał komunikat "NEED_UNWRAP", jeśli z drugiego końca należy podać więcej danych. Musisz więc zachować kolejkę obiektów ByteBuffer. To samo, silnik będzie nadal wyświetlał komunikat "NEED_WRAP", jeśli więcej danych musi zostać wysłanych na drugi koniec, zanim będzie można kontynuować. Idź dalej, aż otrzymasz status "Ukończony" od statusu uzgadniania.

Polecam jednak, że używasz czegoś takiego jak Netty, co czyni to znacznie prostszym. Należy zauważyć, że Netty posiadał wsparcie dla AIO na etapie alfa równym 4. Jednakże wykazano, że AIO jest wolniejsze niż NIO. Dlatego został usunięty.

Jednak nie tylko Netty sprawi, że rzeczy będą łatwiejsze niż próba użycia NIO lub AIO bezpośrednio, ale również ułatwi przełączanie między tymi dwoma, jeśli kiedykolwiek zostanie ponownie wprowadzona funkcja AIO.

Pełny przykład użycia SSL z Netty można znaleźć here.

+0

dziękuję za twój wkład, powinienem zauważyć, że wiem jak używać SSLEngine i mam implementację działającą z tradycyjnym nio. Wersja AIO jednak walczę, aby umieścić dowolny kształt na kodzie. W moim przypadku chciałem nauczyć się, jak wdrożyć wydajną implementację AIO, wykonując własne. (Potrzebuję tylko kilku wskazówek, które sprawdzą się w kategoriach zakleszczeń i koordynowania programów obsługi zakończenia podczas uzgadniania). –

+0

Spojrzenie teraz na starą wersję netty z AIO na okrzyki radosnych. –

+0

Przekonasz się, że kod jest rzeczywiście taki sam. SSLHandler jest programem do obsługi potoków i jest identyczny niezależnie od tego, czy jest używany z fabryką kanałów NIO lub AIO: https://github.com/netty/netty/blob/c149f4bcc0c0d02aa1abcd5e39c155a9e598822e/handler/src/main/java/io/netty/handler/ ssl/SslHandler.java – pjulien