【问题标题】:Java NIO and SSLJava NIO 和 SSL
【发布时间】:2012-12-15 03:18:12
【问题描述】:

我正在使用 java NIO 编写服务器,但有几个问题找不到答案。

首先,关于SSLEngine,如何在单独的线程中正确处理NEED_TASK?当我在单独的线程中调用任务时,它们会完成,但我不知道如何返回执行另一个握手操作。一种选择是从执行委派任务的线程中调用该操作,但我想这不是这样做的方法。

另一个问题是关于从不同的线程然后选择器线程调用interestOps()。在尝试写入频道并没有写入所有数据后,我需要更改关键兴趣。 我考虑过使用 ROX NIO 教程中的某种更改队列,但我在这里的另一个线程中读到这不是最好的方法。

【问题讨论】:

  • 致近距离投票者:这确实是一个真实的问题,即使您个人不理解它。

标签: java ssl nio sslengine


【解决方案1】:

首先关于 SSLEngine,如何在单独的线程中正确处理 NEED_TASK。当我在单独的线程中调用任务时,它们会完成,但我不知道如何返回执行另一个握手操作。

当引擎处于 NEED_TASK 状态时,它不能做任何其他事情。任务完成后,您应该重复最初返回 NEED_TASK 的操作,并让引擎告诉您下一步该做什么。在任务完成之前,您需要阻止或禁用其他线程对该引擎的使用,即不要在该通道上选择。

另一个问题是关于从不同的线程调用interestOps(),然后是选择器线程。在尝试写入频道并没有写入所有数据后,我需要更改关键兴趣。我考虑过使用 ROX NIO 教程中的某种更改队列,但我在这里的另一个线程中读到这不是最好的方法。

那就是我。我讨厌那些排队。我只是唤醒()选择器并更改了interestOps,从未遇到过问题。选择器线程必须正确处理准备好的零键,但它已经需要这样做了。

【讨论】:

  • 我不确定您指的是这两种解决方案中的哪一种,但我有一个完整的、商业可用的 SSLSocketChannel/SSLSelector/SSLServerSocketChannel 产品实现,它在内部使用 SSLEngine 并被打包为 SelectorProvider .详情请咨询。
  • 第二个答案很明确,这就是我要做的。关于第一个我仍然有一些疑问。我必须恢复调用 NEED_TASK 的最后一个操作,这很清楚,但我不知道该怎么做,我唯一能想到的就是从完成任务的线程中恢复它,但这会移动读/写的执行选择器线程。你能给我一些提示吗
  • 我正在寻找 Java SSLengine + NIO 的 GPL 实现。你知道我在哪里可以找到免费的代码示例吗?
  • @user1418979 这完全取决于其余代码的组织方式。我有一个 SSLSelector,所以我可以从任务线程中唤醒它并恢复通道密钥的 interestOps,这最终会导致 OP_READ 或 OP_WRITE 触发,这将导致应用程序重复原始操作。您的里程会有所不同:-)
  • @PeterPenzov Apache Tomcat NIO 连接器中应该有一个,Netty 中也可能有一个。然而,我见过的所有 SSLEngine 代码,除了我的 :-),都无法正确处理重新握手。
猜你喜欢
  • 2010-12-16
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2013-10-07
  • 2014-01-10
  • 1970-01-01
相关资源
最近更新 更多