在Java中,SSLSocket API上的写操作是阻塞的,写操作也不支持超时。
有人可以解释一下吗?
我的应用程序创建了两个线程,一个用于读取,另一个用于写入。
答案 0 :(得分:4)
1-是否存在写操作可以永久阻塞线程的情况?我在互联网上查看,似乎有可能永远阻止。
是的,可以。虽然不是永远不会: - )
2-有人可以建议我们如何为写操作添加超时?
使用Java的套接字/ SSL套接字等实现时,你无法做到这一点。 Java套接字支持连接超时和读取超时,但不支持写入超时。
另请参阅:How can I set Socket write timout in java?
(为什么?1997年在错误ID JDK-4031100中请求了套接字写入超时,但错误已关闭状态" WontFix"。请阅读链接以获取详细信息。)
替代方案包括:
使用Timer实现超时,如果定时器熄灭,则中断线程或关闭Socket。请注意,中断和关闭都会使您处于需要放弃套接字的状态。
使用NIO选择器和非阻塞I / O.
答案 1 :(得分:1)
由于:
解决您的具体问题:
- 是否存在写操作可以永久阻塞线程的情况?我在互联网上查看,似乎有可能永远阻止。
醇>
是。在这种情况下,我已经看到应用程序被封锁了几天。虽然没有,正如@StephenC所说,永远。我们还没那么久。
- 如何为写入操作添加超时?
醇>
您可以使用非阻塞I / O和Selector
在TCP级别执行此操作,并且您可以在其上层叠SSLEngine
以获取SSL,但这是一项单调乏味的工作许多人尝试过的极易出错的运动:很少有人成功。不适合胆小的人。