Java NIO 和 SSL

7
我正在使用Java NIO编写服务器,有几个问题找不到答案。
首先,关于SSLEngine,在单独的线程中如何正确处理NEED_TASK?当我在单独的线程中调用任务时,它们会完成,但我不知道如何返回执行另一个握手操作。一种选择是从执行委派任务的线程调用该操作,但我认为这不是正确的方法。
另一个问题是关于在不同的线程中调用interestOps(),而不是选择器线程。在尝试向通道写入未写入所有数据后,我需要更改键兴趣。我考虑使用类似于ROX NIO教程中的某些更改队列,但我在另一个线程中读到它不是最佳方法。

1
给关闭投票者:即使您个人不理解,这确实是一个真正的问题。 - user207421
1个回答

3
关于SSLEngine,如何在单独的线程中正确处理NEED_TASK。当我在单独的线程中调用任务时,它们完成了,但我不知道如何返回执行另一个握手操作。
当引擎处于NEED_TASK状态时,它无法执行任何其他操作。当任务完成后,您应该重复最初返回NEED_TASK的操作,并让引擎告诉您接下来该做什么。您需要阻止或禁用其他线程对该引擎的使用,直到任务完成,即不要在该通道上进行选择。
另一个问题是关于从不同的线程调用interestOps()而不是选择器线程。尝试写入通道未写入所有数据后,我需要更改关键兴趣。我想使用类似ROX NIO教程中的某种更改队列,但我在这里的另一个线程中读到不是最佳方法。
那应该是我。我讨厌那些队列。我只唤醒选择器并更改interestOps,从未遇到过问题。选择器线程必须正确处理没有准备好的零个键,但它已经需要这样做了。

我不确定您指的是这两个解决方案中的哪一个,但我有一个完整的、商业可用的 SSLSocketChannel/SSLSelector/SSLServerSocketChannel 实现产品,它在内部使用 SSLEngine,并打包为 SelectorProvider。如需详细信息,请联系我。 - user207421
1
我正在寻找Java SSLengine + NIO的GPL实现。你知道在哪里可以找到免费的代码示例吗? - Peter Penzov
1
@user1418979 这完全取决于你的代码组织方式。我有一个SSLSelector,因此可以从任务线程中唤醒它并恢复通道密钥的interestOps,最终会导致OP_READ或OP_WRITE触发,这将导致应用程序重复原始操作。你的情况可能会有所不同 :-) - user207421
@PeterPenzov 在 Apache Tomcat NIO 连接器中应该有一个,在 Netty 中也可能有一个。但是,除了我的代码之外,我所见过的所有 SSLEngine 代码都无法正确处理重新握手。 - user207421
对于那些感兴趣的人,我写了一些东西来使使用SSLEngine更加容易。它可用于NIO或其他用例。[可在SSLFacade(https://github.com/kashifrazzaqui/sslfacade)中获取] - keios
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接