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