为什么SSLSocket写入选项没有超时?

时间:2018-05-22 13:46:35

标签: java sockets ssl blocking sslsocketfactory

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

有人可以解释一下吗?

  1. 是否存在写操作可以永久阻塞线程的情况?我在互联网上查看,似乎有可能永远阻止。
  2. 如何为写入操作添加超时?
  3. 我的应用程序创建了两个线程,一个用于读取,另一个用于写入。

2 个答案:

答案 0 :(得分:4)

  

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.

答案 1 :(得分:1)

由于:

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

      
        
    1. 是否存在写操作可以永久阻塞线程的情况?我在互联网上查看,似乎有可能永远阻止。
    2.   

    是。在这种情况下,我已经看到应用程序被封锁了几天。虽然没有,正如@StephenC所说,永远。我们还没那么久。

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

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