【问题标题】:Why SSLSocket write option does not have timeout?为什么 SSLSocket 写入选项没有超时?
【发布时间】:2018-11-01 07:40:16
【问题描述】:

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

谁能解释一下?

  1. 会不会有写操作会永远阻塞线程的情况?我上网查了一下,好像有永久屏蔽的可能。
  2. 如何为写操作添加超时?

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

【问题讨论】:

    标签: java sockets ssl blocking sslsocketfactory


    【解决方案1】:

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

    是的,可以。虽然不是真的永远:-)

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

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

    另请参阅:How can I set Socket write timout in java?

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

    替代方案包括:

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

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

    【讨论】:

      【解决方案2】:

      因为:

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

      解决您的具体问题:

      1. 会不会有写操作会永远阻塞线程的情况?我上网查了一下,好像有永久屏蔽的可能。

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

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

      您可以在 TCP 级别使用非阻塞 I/O 和 Selector 执行此操作,并且您可以在其上叠加一个 SSLEngine 以获取 SSL,但它很乏味且极易出错许多人尝试过的练习:很少有人成功。不适合胆小的人。

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 1970-01-01
        • 2018-09-01
        • 2012-07-30
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        相关资源
        最近更新 更多