互联网上所有在NIO2上可用的资源/样本都没有TLS/SSL支持,
java.nio.channels.AsynchronousSocketChannel java.nio.channels.AsynchronousServerSocketChannel
据我所知,SSLEngine连接的生命周期不同于AsynchronousSocketChannel.connect && AsynchronousServerSocketChanne.accept,它应该封装在AIO实现中,那么我如何才能同时使用它们呢?注意:我在Grizzly项目中的一段视频中谈到他们已经实现了它,我看了源代码,但我看到了AIO,但没有看到TLS/SSL集成……
提前感谢!
发布于 2013-09-23 03:50:59
对原问题的评论确实是正确的。SSLEngine直接使用ByteBuffer进行操作。
这意味着它与AIO兼容。您首先接受一个连接。然后,客户端连接并执行初始写入。要确定是否有足够的数据缓冲,请使用handshake status和status。因此,您需要保留一个ByteBuffer对象队列。你一直走,直到你从握手状态“完成”。
不过,我建议你使用像Netty这样的东西,它会让这一切变得简单得多。应该注意的是,Netty在alpha阶段4中确实支持AIO。但是,它显示AIO比NIO慢。因此,它被删除了。
然而,Netty不仅会让事情变得比尝试直接使用NIO或AIO更简单,而且如果重新引入AIO,还会使两者之间的切换变得容易。
有关在Netty中使用SSL的完整示例可以在here中找到。
发布于 2018-09-06 05:12:50
在Java中执行TLS的标准方法是使用SSLEngine。但是这个类很难使用。有一些教程,但是对于一个典型的应用程序来说,使用SSLEngine应该是不可能的。ByteChannel和他们的朋友不是直接支持的,这意味着需要做很多工作。
前段时间我遇到了同样的问题,并最终编写了自己的库。有一些例子,当然也有像Netty等项目内部的代码,但这两个选项都不健壮,也不容易重用。
TLS Channel将SSLEngine封装在ByteBuffer中,并允许像使用普通SocketChannels一样使用它。AsynchronousByteChannels是隐藏选择器循环的更高级别抽象;该库也支持这一点。
https://stackoverflow.com/questions/12854255
复制相似问题