从SSLEngine文档中:“通过将SSL / TLS抽象与I / O传输机制分离,SSLEngine可用于多种I / O类型,例如非阻塞I / O(轮询),可选非-阻塞I / O,套接字和传统的Input / OutputStream,本地ByteBuffer或字节数组,..“与使用SSLEngine阻塞IO相比,将SSLEngine与常规Socket和阻塞通道一起使用会更好。

最佳答案

是的,是的。 NIO不仅涉及非阻塞IO。它还带来了:


更高级别的API,基于包装的缓冲区(ByteBuffers),而不仅仅是字节数组。
“分散”和“聚集” API,即在同一IO操作中使用多个顺序缓冲区的能力。
直接IO:使用“直接” ByteBuffer,它可以在堆外使用。


最后一点具有非常具体的一般性能影响,因为当使用基于堆的数组/缓冲区时,JVM会对本机调用中发送的任何数组进行额外的复制,以促进与垃圾回收器的同步。使用本机缓冲区可以避免这种情况,它可以大大减少垃圾回收的开销。

就是说,SSLEngine存在巨大的可用性问题,因为正确使用它非常困难,特别是比使用良好的旧SSLSocket困难得多。

幸运的是,this library允许将SSLEngine与ByteChannel接口一起使用,围绕SSLEngine进行所有繁重的工作(免责声明:我是主要作者)。

关于java - 带有阻塞IO的SSLEngine,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39866496/

10-11 06:37