Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel和TLS/SSL

use*_*371 10 java grizzly java-7 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集成......

提前致谢!

小智 4

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

这意味着它与 AIO 兼容。您首先接受连接。然后客户端连接并执行初始写入。要确定是否有足够的数据缓冲,请使用握手状态状态。如果需要从另一端提供更多数据,引擎将不断告诉您“NEED_UNWRAP”。所以你需要保留一个 ByteBuffer 对象的队列。同样,如果在继续之前需要将更多数据发送到另一端,引擎会不断告诉您“NEED_WRAP”。您继续进行,直到握手状态变为“完成”。

不过,我建议您使用 Netty 之类的东西,这会让这变得更简单。需要注意的是,Netty 在 4 的 alpha 阶段确实支持 AIO。但是,事实证明 AIO 比 NIO 慢。因此,它被删除了。

然而,Netty 不仅会让事情比直接使用 NIO 或 AIO 更简单,而且如果重新引入 AIO,也可以轻松地在两者之间切换。

可以在此处找到将 SSL 与 Netty 结合使用的完整示例。