2012-12-30 50 views
6

我正在写一个服务器使用Java的NIO,我有几个问题,我无法找到答案。Java的NIO和SSL

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

另一个问题是关于从不同的线程调用interestOps()然后选择线程。在尝试写入频道之后,我不得不写入所有数据,以改变关键兴趣。 我想过使用某种类似于ROX NIO教程中的变化队列,但是我在另一个线程中看过这不是最好的方法。

+1

致密选民:这确实是一个真正的问题,即使你个人不理解它。 – EJP

回答

3

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

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

另一个问题是关于从不同线程调用interestOps()然后选择线程。在尝试写入频道之后,我不得不写入所有数据,以改变关键兴趣。我考虑过在ROX NIO教程中使用某种类型的更改队列,但是我在另一个线程中看过,它不是最好的方法。

那就是我。我讨厌那些队列。我只是唤醒()选择器,并改变interestOps,从来没有看到这个问题。选择器线程必须正确处理准备好的零键,但它已经需要这样做。

+0

我对这个解决方案也很感兴趣。任何工作的例子? –

+0

我不确定您引用了这两种解决方案中的哪一种,但是我有一个完整的商业可用实现,它在内部使用SSLEngine并打包为SelectorProvider,该实现的SSLSocketChannel/SSLSelector/SSLServerSocketChannel产品。详情请求。 – EJP

+0

第二个答案很明确,那就是我要做的。关于第一我还有一些疑问。我必须恢复最后一个调用NEED_TASK的操作,但是我不知道该怎么做,我能想到的唯一办法是从线程恢复完成的任务,但这会将读/写的执行从选择器线程。你可以给我一些提示如何继续 – user1418979