当我使用常规套接字时,我可以调用 getInputStream() 并使用 available() 来查看有多少字节可用。我切换到 SSLSocket,但由于某种原因,现在 available() 总是返回 0。当我阅读时,我仍然可以获得数据。如何判断 SSLSocket 中是否有可用数据,以便在没有数据时可以不阻塞地为其提供服务?
笔记:
没有办法做到这一点。如果不先解密,您的流无法告诉您数据的长度。available()将始终返回 0 SSLSocket。
正如本聊天中提到的,您想要检查数据的原因是为了防止read()调用时发生阻塞,因此您可以在单个线程上处理多个连接,而不是每个客户端系统一个线程。
相反,请使用非阻塞替代方案。java.nio目前没有自己的 SSL 实现SocketChannel,但您可以在线找到一个(如此处)或创建自己的 SSL 实现。
通过这个系统,您可以Selector向每个通道注册一个,并使用“选择器线程”管理它们。我在这里写了一个如何使用选择器的示例(向下滚动到使用选择器)。
通过非阻塞 IO,您可以在每个线程处理多个客户端,从而实现扩展。这种管理通道的方法是由于C10k 问题而提出的
| 归档时间: |
|
| 查看次数: |
2603 次 |
| 最近记录: |