Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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
如何判断JavaSSLSocket是否有可用的数据?_Java_Sockets_Ssl - Fatal编程技术网

如何判断JavaSSLSocket是否有可用的数据?

如何判断JavaSSLSocket是否有可用的数据?,java,sockets,ssl,Java,Sockets,Ssl,当我使用常规套接字时,我可以调用getInputStream()并使用available()查看有多少字节可用。我切换到SSLSocket,但由于某些原因,现在available()总是返回0。当我阅读时,我仍然可以得到数据。如何判断SSLSocket中是否有可用数据,以便在没有数据的情况下不阻塞地为其提供服务 注: 我无法对InputStream调用read(),否则线程将阻塞。我希望在我的实现中不阻塞 available()返回0,即使存在SSLSocket的InputStream的数据

当我使用常规套接字时,我可以调用getInputStream()并使用available()查看有多少字节可用。我切换到SSLSocket,但由于某些原因,现在available()总是返回0。当我阅读时,我仍然可以得到数据。如何判断SSLSocket中是否有可用数据,以便在没有数据的情况下不阻塞地为其提供服务

注:

  • 我无法对InputStream调用read(),否则线程将阻塞。我希望在我的实现中不阻塞
  • available()返回0,即使存在SSLSocket的InputStream的数据

    • 没有办法做到这一点。如果不先对数据进行解密,流就无法告诉您数据的长度
      available()
      对于
      SSLSocket
      将始终返回0

      如中所述,您希望检查数据的原因是防止调用时阻塞
      read()
      ,因此您可以在单个线程上处理多个连接,而不是在每个客户端系统上处理一个线程

      相反,使用非阻塞替代方案
      java.nio
      目前没有自己的SSL实现
      SocketChannel
      ,但您可以在线找到(类似)或创建自己的SSL实现

      使用此系统,您可以向每个频道注册
      选择器
      ,并使用“选择器线程”管理所有频道。我写了一个如何使用选择器的示例(使用选择器向下滚动到


      使用非阻塞IO,您可以为每个线程处理多个客户机,从而可以进行扩展。之所以提出这种渠道管理方法,是因为没有办法做到这一点。如果不先对数据进行解密,流就无法告诉您数据的长度
      available()
      对于
      SSLSocket
      将始终返回0

      如中所述,您希望检查数据的原因是防止调用时阻塞
      read()
      ,因此您可以在单个线程上处理多个连接,而不是在每个客户端系统上处理一个线程

      相反,使用非阻塞替代方案
      java.nio
      目前没有自己的SSL实现
      SocketChannel
      ,但您可以在线找到(类似)或创建自己的SSL实现

      使用此系统,您可以向每个频道注册
      选择器
      ,并使用“选择器线程”管理所有频道。我写了一个如何使用选择器的示例(使用选择器向下滚动到


      使用非阻塞IO,您可以为每个线程处理多个客户机,从而可以进行扩展。这种管理渠道的方法是由于

      我想你已经解决了你的问题,但是对于像我这样的人,我找到了一个更简单的解决方案。如果执行读取,那么available()方法将填充解密的内容。如何使用和滥用这个?读取套接字上SoTimeout值非常低的单个字节,如果捕获到SocketTimeoutException,则连接为空,如果未捕获,则将读取的字节前置到将来对消息的解释中。在.available()==0之前,继续使用它。

      我想你已经解决了你的问题,但对于像我这样的人,我找到了一个更简单的解决方案。如果执行读取,那么available()方法将填充解密的内容。如何使用和滥用这个?读取套接字上SoTimeout值非常低的单个字节,如果捕获到SocketTimeoutException,则连接为空,如果未捕获,则将读取的字节前置到将来对消息的解释中。在.available()==0之前,只需继续使用它。

      可能重复有趣的(请查看)。但是,在我的例子中,有可用的数据,因此read()不应该被阻塞,available不应该返回0。也可以查看该答案的第一条注释—“还要注意,available()对于SSL套接字总是返回零”。了解为什么在您的案例中阻塞是一个问题会有所帮助。记住,我明白了,你正在使用阻塞IOAh。那么,这是否意味着如果不从SSLSocket读取数据,就无法判断SSLSocket中是否有数据?理论上,阻塞不是一个问题,只是我需要重构大量代码。我以前使用Sockets而不是SSLSockets,并且使用了available(),所以我希望转换会更容易。可能的重复(检查)很有趣。但是,在我的例子中,有可用的数据,因此read()不应该被阻塞,available不应该返回0。也可以查看该答案的第一条注释—“还要注意,available()对于SSL套接字总是返回零”。了解为什么在您的案例中阻塞是一个问题会有所帮助。记住,我明白了,你正在使用阻塞IOAh。那么,这是否意味着如果不从SSLSocket读取数据,就无法判断SSLSocket中是否有数据?理论上,阻塞不是一个问题,只是我需要重构大量代码。我以前使用Socket而不是SSLSockets,并且使用available(),所以我希望转换会更容易。感谢@JavaProphet,这个简单的解决方法对于我正在做的概念验证非常有用。感谢@JavaProphet,这个简单的解决方法对于我正在做的概念验证非常有用。