Чтение из блоков сокетов доступно до тех пор, пока данные являются доступными. Если хост является недосягаемым, ваше приложение будет ожидать в течение длительного периода времени, и все будет зависеть от того, когда операционная система, под управлением которой работает компьютер, определит момент завершения ожидания.
Вы можете решить, какое значение тайм-аута будет разумным для вашего определенного приложения. Затем вызовите метод setSoTimeout, чтобы задать значение тайм-аута(в миллисекундах).
1 2 |
Socket s = new Socket(...); s.setSoTimeout(30000); // Тайм-аут наступит через 30 секунд |
Если значение тайм-аута было задано для сокета, то все последующие операции чтения и записи будут генерировать исключение SocketTimeoutException В момент наступления тайм-аута, прежде чем операция завершит свою работу. Вы можете перехватить исключение и отреагировать на тайм-аут.
1 2 3 4 5 6 7 8 9 |
try { InputStream in = s.getInputStream(); // Чтение из in ... } catch(InterruptedIOException exception) { реакция на тайм-аут } |
Вам придется решить еще одну дополнительную проблему, связанную с тайм-аутами. Конструктор:
1 |
Socket(String host, int port) |
может удерживать блокировку в течение неопределенного периода времени до тех пор, пока не будет установлено исходное соединение с хостом.
Эту проблему можно преодолеть, если сначала создать несоединенный сокет, а затем соединиться с ним во время тайм-аута:
1 2 |
Socket s = new Socket(); s.connect(new InetSocketAddress(host, port), timeout); |