Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 和 TLS/SSL

标签 java java-7 grizzly nio2

INTERNET 上所有在 NIO2 上可用的源/示例都没有 TLS/SSL 支持,

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

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

提前致谢!

最佳答案

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

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

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

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

可在 Netty 中找到使用 SSL 的完整示例 here .

关于Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 和 TLS/SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12854255/

相关文章:

java - LWJGL 端口到 android

java - Java Swing 的循环进度条不起作用

exception - JAX-RS 异常映射器在 Grizzly 容器中不起作用

jar里面的java库

java - azure 宇宙 : changeFeedProcessor: Error: PartitionKey value must be supplied for this operation

java - 自定义查询方法返回 Object[] 而不是实体列表

Eclipse 中的 Java 7 JVM 验证错误

java错误: installation of android studio on ubuntu 16. 04

java - SimpleWebSocket 类型中的 setBroadcaster(Broadcaster) 在 Grizzly java 中不可见

java - 用于 Comet 应用程序的 Node.js 与 Java