12

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

2 回答 2

5

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

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

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

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

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

于 2013-09-22T19:50:59.453 回答
1

在 Java 中执行 TLS 的标准方法是使用 SSLEngine。但是那个类很难使用。周围有一些教程,但对于典型的应用程序,使用 SSLEngine 应该是不可能的。不直接支持 ByteChannel 和他们的朋友,这意味着很多工作。

前段时间我遇到了同样的问题,最终编写了自己的库。那里有一些示例,当然还有像 Netty 等项目中的代码。但是这两个选项都不是健壮的或易于重用的。

TLS 通道将 SSLEngine 包装在 ByteBuffer 中,并允许像普通的 SocketChannel 一样使用它。AsynchronousByteChannels 是隐藏选择器循环的更高级别的抽象;图书馆也支持这一点。

于 2018-09-05T21:12:50.227 回答