NIO2上提供的INTERNET上的所有来源/样本都没有TLS / SSL支持,
java.nio.channels.AsynchronousSocketChannel
java.nio.channels.AsynchronousServerSocketChannel
据我所知,连接的SSLEngine生命周期不同于AsynchronousSocketChannel.connect&& AsynchronousServerSocketChanne.accept, TLS / SSL应该封装在AIO实现中,所以如何使用它们......? 注意:我在Grizzly项目中就是一个关于他们已经实现它的视频, 我查看了源代码,但是我看到了AIO但没有看到TLS / SSL集成......
提前致谢!
答案 0 :(得分:3)
对原始问题的评论确实是正确的。 SSLEngine直接使用ByteBuffer进行操作。
这意味着它与AIO兼容。首先接受连接。然后客户端连接并执行初始写入。要确定您是否有足够的数据缓冲,请使用handshake status和status。如果需要从另一端提供更多数据,引擎会一直告诉你“NEED_UNWRAP”。所以你需要保留一个ByteBuffer对象的队列。同样的事情,引擎会一直告诉你“NEED_WRAP”,如果有更多的数据需要发送到另一端才能继续。你继续前进,直到你从握手状态“完成”。
我建议你使用像Netty这样的东西,这样可以简单得多。值得注意的是,Netty在4阶段的alpha阶段确实支持AIO。然而,事实证明AIO比NIO慢。因此,它被删除了。
然而,Netty不仅会让事情比直接使用NIO或AIO更简单,而且如果重新引入AIO,也可以轻松地在两者之间切换。
可以找到使用SSL与Netty的完整示例here。
答案 1 :(得分:0)
在Java中执行TLS的标准方法是使用SSLEngine。但是该类严重很难使用。周围有一些教程,但是对于典型的应用程序,使用SSLEngine应该是不可能的。不直接支持ByteChannel及其朋友,这意味着需要大量工作。
前段时间,我遇到了同样的问题,最终编写了自己的库。有一些示例,当然还有Netty等项目中的代码。但是,这两种选择都不是可靠的或易于重用的。
TLS Channel将SSLEngine封装在ByteBuffer中,并允许像普通的SocketChannels一样使用它。 AsynchronousByteChannels是更高层次的抽象,它隐藏了选择器循环。该库也支持。