首页 > 解决方案 > 为什么 SSLSocket 写入选项没有超时?

问题描述

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

有人可以解释一下吗?

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

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

标签: javasocketssslblockingsslsocketfactory

解决方案


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

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

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

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

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

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

替代方案包括:

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

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


推荐阅读