0

在 Java 中,SSLSocket API 上的写操作是阻塞的,并且写操作也不支持超时。

有人可以解释一下吗?

  1. 会不会有写操作可以永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁。
  2. 如何为写操作添加超时?

我的应用程序创建了两个线程,一个用于读取,一个用于写入。

4

2 回答 2

4

1-是否存在写操作可以永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁。

是的,可以。虽然不是字面上永远:-)

2-有人可以建议我们如何为写操作添加超时吗?

您无法使用 Java 的套接字/SSL 套接字等实现来做到这一点。Java 套接字支持连接超时和读取超时,但不支持写入超时。

另请参阅:如何在 java 中设置 Socket 写入超时?

(为什么?早在 1997 年,错误 ID JDK-4031100中就请求了套接字写入超时,但该错误以“WontFix”状态关闭。阅读链接了解详细信息。)

替代方案包括:

  1. 使用 Timer 实现超时,如果定时器关闭,则中断线程或关闭 Socket。请注意,中断和关闭都会使您处于需要放弃套接字的状态。

  2. 使用 NIO 选择器和非阻塞 I/O。

于 2018-05-22T14:37:45.813 回答
1

因为:

  1. 如果根本需要这样的工具,那么 TCP 级别就需要它,而不仅仅是 SSL 级别。
  2. 在 TCP 级别没有针对它的 API,我的意思不仅仅是在 Java 中:也没有针对它的 C 级别 API,可能在几个平台上除外。
  3. 如果您在 SSL 级别添加它,写入超时事件将使连接处于不确定状态,这意味着它必须关闭,因为您无法知道已传输了多少数据,因此您无法维护SSL 级别的完整性。

要解决您的具体问题:

  1. 会不会有写操作可以永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁。

是的。在这种情况下,我已经看到一个应用程序被阻止了几天。虽然不是,正如@StephenC 正确地说的那样,永远。我们还没有活那么久。

  1. 如何为写操作添加超时?

您可以在 TCP 级别使用非阻塞 I/O 和 a 来执行此操作,并且您可以在其之上Selector分层以获得 SSL,但这是许多人尝试过的乏味且极易出错的练习:很少有人成功SSLEngine. 不适合胆小的人。

于 2018-05-22T15:21:25.287 回答