java - 为什么 SSLSocket 写入选项没有超时?
问题描述
在 Java 中,SSLSocket API 上的写操作是阻塞的,并且写操作也不支持超时。
有人可以解释一下吗?
- 会不会有写操作可以永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁。
- 如何为写操作添加超时?
我的应用程序创建了两个线程,一个用于读取,一个用于写入。
解决方案
1-是否存在写操作可以永远阻塞线程的情况?我在网上查了一下,似乎有可能永远封锁。
是的,可以。虽然不是字面上永远:-)
2-有人可以建议我们如何为写操作添加超时吗?
您无法使用 Java 的套接字/SSL 套接字等实现来做到这一点。Java 套接字支持连接超时和读取超时,但不支持写入超时。
另请参阅:如何在 java 中设置 Socket 写入超时?
(为什么?早在 1997 年,错误 ID JDK-4031100中就请求了套接字写入超时,但该错误以“WontFix”状态关闭。阅读链接了解详细信息。)
替代方案包括:
使用 Timer 实现超时,如果定时器关闭,则中断线程或关闭 Socket。请注意,中断和关闭都会使您处于需要放弃套接字的状态。
使用 NIO 选择器和非阻塞 I/O。
推荐阅读
- node.js - Sequelize 包含返回数据格式
- ios - 视图高度意外更改(Swift)
- b-tree - 如何找到具有最大度数的B树的中值键?
- c# - 如何在内存中找到另一个进程的某个变量值(在 /proc/
/mem )(在 C# 中,在 Linux 中)? - c# - 对象引用未设置为反序列化 json 数据中的对象实例
- python - 熊猫删除 for 循环
- python - 熊猫数据框日期时间比较代码中的错误?
- asp.net-web-api - 关于 HTTP 动词的所有可能性的问题
- java - 远程主机终止了 Java 中的握手
- pyspark - 手动选择镶木地板分区与在 pyspark 中过滤它们