2016-05-15 6 views
0

Предположим, что у меня есть несколько соединений сокетов, каждый из которых может переключаться между бесконечным таймаутом и конечным таймаутом, индивидуально, для операций ввода-вывода. Документация для Socket.setSoTimeout() подразумевает, что вызов setSoTimeout() на любые Socket изменит таймауты для всех Socket объектов, так как поле SocketOptions.SO_TIMEOUT является статическим.Настройка индивидуального SO_TIMEOUT

Есть ли способ установить тайм-ауты для отдельных Socket объектов?

ответ

0

После некоторого копания вокруг исходного кода java.net.Socket, кажется, что SocketOptions.SO_TIMEOUT не глобальное значение тайм-аута. Скорее, это какой-то идентификатор для опции, и фактическое значение тайм-аута извлекается через экземпляр 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; 
    } 
} 
1

Нет, это не означает, что он изменит timeout для всех сокетов. он изменит только timeout для связанного объекта сокета. Фрагменты из ява Документов Socket#setSoTimeout

Включение/выключение SO_TIMEOUT с указанным тайм-аута в миллисекундах. С этой опцией, установленной на ненулевой тайм-аут, вызов read() на входе , связанный с , этот Socket будет блокировать только для этого времени. Если истекает время ожидания, возникает java.net.SocketTimeoutException, хотя сокет по-прежнему равен . Опция должна быть активирована до того, как будет введена операция блокировки . Тайм-аут должен быть> 0. Время ожидания интерпретируется как бесконечный тайм-аут.

Смежные вопросы