2012-10-12 20 views
8

tüm kaynakları/numuneler, ben SSLEngine yaşam döngüsünü anlamak gibiJava NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel ve TLS/SSL mevcut NIO2 TLS/SSL desteği olmadan İNTERNET üzerinde

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

Bağlantının farklı olması AsynchronousSocketChannel.connect & & AsynchronousServerSocketChanne.accept, TLS/SSL, AIO uygulamasında kapsüllenmiş olmalıdır, bu yüzden bunları nasıl kullanabilirim? NOT: Çok Grizzly projesinde Bir video onlar hakkında konuşmak zaten ben kaynak koduna bakmak , bunu uygulamaya ama AIO'yu gördüğü ancak TLS/SSL entegrasyonu ... önceden

teşekkürler!

+0

Bağlantının yaşam döngüsü aynıdır: yalnızca bir bağlantıdır. Bununla birlikte, SSLEngine'in bloke edici olmayan NIO'yla bütünleşmesi, okumak istediğiniz zaman yazmak zorunda olduğum gibi diğer nedenlerle yeteri kadar zordur, ve * tam tersi, * ve bununla nasıl başa çıkılacağı: Bunu denemekten hoşlanmıyorum Async I/O ile. – EJP

+0

PS: Ödünç yorumlarımdaki kötü hecelemenin farkına vardım, kimse bunu nasıl düzenleyeceğini biliyor mu? –

+0

Daha sonra, SSLEngine kullanan bir AsyncSSLSocketChannel uygulamış olduğuma yaptığım yorumu eklemeliyim. Tahmin edildiği gibi kolay değildi. – EJP

cevap

3

Asıl soru hakkındaki yorum gerçekten doğrudur. SSLEngine, ByteBuffer doğrudan kullanıyor.

Bu, AIO ile uyumlu olduğu anlamına gelir. Bağlantı kabul ederek başlıyorsunuz. İstemci daha sonra ilk yazımı bağlar ve gerçekleştirir. Yeterli veri arabelleğe sahip olup olmadığını belirlemek için handshake status ve status kullanın. Daha fazla veri diğer uçtan sağlanacaksa, motor size "NEED_UNWRAP" demeye devam edecektir. Yani bir ByteBuffer nesnesi kuyruğunu tutmalısınız. Aynı şey, devam edebilmek için daha fazla verinin diğer tarafa gönderilmesi gerektiğinde, motor size "NEED_WRAP" demeye devam edecektir. El sıkışması durumundan "Bitir" olana kadar devam edersiniz.

Bunu çok daha kolay yapan Netty gibi bir şey kullanmanızı tavsiye ederim. Netty'nin 4 numaralı alfa aşamasında AIO'ya destek verdiği belirtilmelidir. Ancak, AIO'nun NIO'dan daha yavaş olduğu gösterilmiştir. Bu nedenle, kaldırıldı. Bununla birlikte, Netty sadece NIO veya AIO'yu doğrudan kullanmaya çalışmaktan daha basit şeyler yapmakla kalmayacak, aynı zamanda AIO'nun yeniden tanıtımı için ikisi arasında geçiş yapmayı da kolaylaştıracaktır.

Netty ile SSL kullanmanın tam bir örneği here bulunabilir.

+0

Girişiniz için teşekkürler, SSLEngine'ı nasıl kullanacağımı ve geleneksel nio ile nasıl çalıştığını bildiğimi belirtmeliyim. Ancak AIO versiyonu, kod üzerinde herhangi bir şekil koymak için uğraşıyorum. Benim durumumda, verimli bir AIO uygulamasını kendi başıma yuvarlayarak nasıl uygulayacağımı öğrenmek istedim. (Sadece kilitlenmeler açısından ve el sıkışma sırasında tamamlama işleyicilerini koordine ederek, bilge tasarımına ihtiyacım var). –

+0

Şimdi işaretçiyi şereflendiren AIO ile netty'nin eski versiyonuna göz atın. –

+0

Kodun gerçekten aynı olduğunu göreceksiniz. SSLHandler bir boru hattı işleyicisidir ve bir NIO veya AIO kanal fabrikasıyla kullanıldığında aynıdır. Https://github.com/netty/netty/blob/c149f4bcc0c0d02aa1abcd5e39c155a9e598822e/handler/src/main/java/io/netty/handler/ sSL/SslHandler.java – pjulien