【问题标题】:Setting Individual SO_TIMEOUT设置个人 SO_TIMEOUT
【发布时间】:2023-03-17 19:26:01
【问题描述】:

假设我有多个套接字连接,每个套接字连接都可能希望在无限超时和有限超时之间单独切换,以进行 I/O 操作。 Socket.setSoTimeout() 的文档暗示对任何 Socket 调用 setSoTimeout() 将更改所有 Socket 对象的超时,因为字段 SocketOptions.SO_TIMEOUT 是静态的。

有没有办法为单个 Socket 对象设置超时?

【问题讨论】:

    标签: java sockets io


    【解决方案1】:

    在对java.net.Socket 的源代码进行了一番挖掘之后,似乎SocketOptions.SO_TIMEOUT 不是全局超时值。相反,它是某个选项的某种 ID,而实际超时值是通过使用该 ID 的SocketImpl 实例检索的。

    public synchronized int getSoTimeout() throws SocketException {
        if (isClosed())
            throw new SocketException("Socket is closed");
        Object o = getImpl().getOption(SocketOptions.SO_TIMEOUT);
        /* extra type safety */
        if (o instanceof Integer) {
            return ((Integer) o).intValue();
        } else {
            return 0;
        }
    }
    

    【讨论】:

      【解决方案2】:

      不,这并不意味着它将更改所有套接字的timeout。它只会为关联的套接字对象更改timeout。 java 文档的摘录 Socket#setSoTimeout

      使用指定的超时启用/禁用 SO_TIMEOUT,以毫秒为单位。 将此选项设置为非零超时,read() 调用 与 this Socket 关联的 InputStream 将只阻塞这个 多少时间。如果超时到期,则 引发了 java.net.SocketTimeoutException,尽管 Socket 仍然存在 有效的。必须在进入阻止之前启用该选项 操作才能生效。超时必须 > 0。超时为零 被解释为无限超时。

      【讨论】:

        猜你喜欢
        • 2017-07-09
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 2011-01-25
        相关资源
        最近更新 更多