Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么SSLSocket写入选项没有超时?_Java_Sockets_Ssl_Blocking_Sslsocketfactory - Fatal编程技术网

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

Java 为什么SSLSocket写入选项没有超时?,java,sockets,ssl,blocking,sslsocketfactory,Java,Sockets,Ssl,Blocking,Sslsocketfactory,在Java中,SSLSocket API上的写入操作是阻塞的,并且写入操作也不支持超时 有人能解释一下吗 是否存在写入操作会永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁 如何为写入操作添加超时 我的应用程序创建了两个线程,一个用于读取,一个用于写入 1-是否存在写入操作会永久阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁 是的,可以。虽然并非永远如此:-) 2-有人能建议我们如何为写入操作添加超时吗 您不能用Java的套接字/SSL套接字实现,等等。Java套接字支持连接超时和

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

有人能解释一下吗

  • 是否存在写入操作会永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁
  • 如何为写入操作添加超时
  • 我的应用程序创建了两个线程,一个用于读取,一个用于写入

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

    是的,可以。虽然并非永远如此:-)

    2-有人能建议我们如何为写入操作添加超时吗

    您不能用Java的套接字/SSL套接字实现,等等。Java套接字支持连接超时和读取超时,但不支持写入超时

    另见:

    (为什么?早在1997年,bug ID中就要求套接字写入超时,但bug以“WontFix”状态关闭。有关详细信息,请阅读链接。)

    备选方案包括:

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

  • 使用NIO选择器和非阻塞I/O

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

    是的,可以。虽然并非永远如此:-)

    2-有人能建议我们如何为写入操作添加超时吗

    您不能用Java的套接字/SSL套接字实现,等等。Java套接字支持连接超时和读取超时,但不支持写入超时

    另见:

    (为什么?早在1997年,bug ID中就要求套接字写入超时,但bug以“WontFix”状态关闭。有关详细信息,请阅读链接。)

    备选方案包括:

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

  • 使用NIO选择器和非阻塞I/O

  • 因为:

  • 如果真的需要这样的工具,那么它就需要在TCP级别,而不仅仅是SSL级别
  • 它在TCP级别上没有API,我的意思不仅仅是在Java中:它也没有C级别的API,除了在几个平台上
  • 如果在SSL级别添加,写入超时事件将使连接处于不确定状态,这意味着连接必须关闭,因为您不知道传输了多少数据,因此无法在SSL级别保持完整性
  • 要解决您的具体问题:

  • 是否存在写入操作会永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁
  • 对。我见过一个应用程序在这种情况下被阻塞了好几天。正如@StephenC正确地说,虽然不是永远。我们还没活那么久

  • 如何为写入操作添加超时
  • 您可以使用非阻塞I/O和
    选择器在TCP级别执行此操作,并且可以在其上分层
    SSLEngine
    ,以获得SSL,但这是一个繁琐且极易出错的操作,许多人都尝试过:很少有人成功。不适合胆小的人。

    因为:

  • 如果真的需要这样的工具,那么它就需要在TCP级别,而不仅仅是SSL级别
  • 它在TCP级别上没有API,我的意思不仅仅是在Java中:它也没有C级别的API,除了在几个平台上
  • 如果在SSL级别添加,写入超时事件将使连接处于不确定状态,这意味着连接必须关闭,因为您不知道传输了多少数据,因此无法在SSL级别保持完整性
  • 要解决您的具体问题:

  • 是否存在写入操作会永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁
  • 对。我见过一个应用程序在这种情况下被阻塞了好几天。正如@StephenC正确地说,虽然不是永远。我们还没活那么久

  • 如何为写入操作添加超时
  • 您可以使用非阻塞I/O和
    选择器在TCP级别执行此操作,并且可以在其上分层
    SSLEngine
    ,以获得SSL,但这是一个繁琐且极易出错的操作,许多人都尝试过:很少有人成功。不适合胆小的人