【发布时间】:2018-11-01 07:40:16
【问题描述】:
在Java中,SSLSocket API上的写操作是阻塞的,写操作也不支持超时。
谁能解释一下?
- 会不会有写操作会永远阻塞线程的情况?我上网查了一下,好像有永久屏蔽的可能。
- 如何为写操作添加超时?
我的应用程序创建了两个线程,一个用于读取,一个用于写入。
【问题讨论】:
标签: java sockets ssl blocking sslsocketfactory
在Java中,SSLSocket API上的写操作是阻塞的,写操作也不支持超时。
谁能解释一下?
我的应用程序创建了两个线程,一个用于读取,一个用于写入。
【问题讨论】:
标签: java sockets ssl blocking sslsocketfactory
1- 是否存在写操作可以永久阻塞线程的情况?我上网查了一下,好像有永久封禁的可能。
是的,可以。虽然不是真的永远:-)
2- 有人可以建议我们如何为写操作添加超时吗?
您无法使用 Java 的套接字/SSL 套接字等实现来做到这一点。 Java 套接字支持连接超时和读取超时,但不支持写入超时。
另请参阅:How can I set Socket write timout in java?
(为什么?早在 1997 年,错误 ID JDK-4031100 中就请求了套接字写入超时,但该错误以“WontFix”状态关闭。阅读链接了解详细信息。)
替代方案包括:
使用 Timer 实现超时,如果定时器超时,则中断线程或关闭 Socket。请注意,中断和关闭都会使您处于需要放弃套接字的状态。
使用 NIO 选择器和非阻塞 I/O。
【讨论】:
因为:
解决您的具体问题:
- 会不会有写操作会永远阻塞线程的情况?我上网查了一下,好像有永久屏蔽的可能。
是的。在这种情况下,我已经看到一个应用程序被阻止了几天。虽然不是,正如@StephenC 正确地说的那样,永远。我们还没活那么久。
- 如何为写操作添加超时?
您可以在 TCP 级别使用非阻塞 I/O 和 Selector 执行此操作,并且您可以在其上叠加一个 SSLEngine 以获取 SSL,但它很乏味且极易出错许多人尝试过的练习:很少有人成功。不适合胆小的人。
【讨论】: