Java NIO2 AsynchronousSocketChannel / AsynchronousServerSocketChannel和TLS / SSL

时间:2012-10-12 07:28:51

标签: java java-7 grizzly nio2

NIO2上提供的INTERNET上的所有来源/样本都没有TLS / SSL支持,

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

据我所知,连接的SSLEngine生命周期不同于AsynchronousSocketChannel.connect&& AsynchronousServerSocketChanne.accept, TLS / SSL应该封装在AIO实现中,所以如何使用它们......? 注意:我在Grizzly项目中就是一个关于他们已经实现它的视频, 我查看了源代码,但是我看到了AIO但没有看到TLS / SSL集成......

提前致谢!

2 个答案:

答案 0 :(得分:3)

对原始问题的评论确实是正确的。 SSLEngine直接使用ByteBuffer进行操作。

这意味着它与AIO兼容。首先接受连接。然后客户端连接并执行初始写入。要确定您是否有足够的数据缓冲,请使用handshake statusstatus。如果需要从另一端提供更多数据,引擎会一直告诉你“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是更高层次的抽象,它隐藏了选择器循环。该库也支持。