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