Подтвердить что ты не робот

Какова функциональность setSoTimeout и как она работает?

Я пытаюсь изучить Socket самостоятельно. Я немного смущен, следуя тексту с сайта Oracle. У меня есть некоторые вопросы по этому поводу. Заранее благодарим за любое ясное объяснение.

setSoTimeout

public void setSoTimeout (int timeout) выбрасывает SocketException

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

  • Что такое SO_TIMEOUT?
  • Socket - это конечная точка соединения. Если я скажу

    mySocket.setSoTimeout(2000);
    

    Означает ли это, что я блокирую чтение любого ввода с сервера/клиента для этого сокета за 2000 миллисекунд, и после этого сокет готов к чтению данных?

  • Что означает истечение срока ожидания?

  • Какая опция должна быть активирована до блокировки?

  • Бесконечный таймаут означает, что сокет больше не читается?

4b9b3361

Ответ 1

JavaDoc объясняет это очень хорошо:

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

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

Ответ 2

Означает ли это, что я блокирую чтение любых данных с сервера/клиента для этого сокета за 2000 миллисекунд, и после этого сокет готов к чтению данных?

Нет, это означает, что если данные не поступят в течение 2000 мс, будет выбрано SocketTimeoutException.

Что означает истечение срока ожидания?

Это означает, что 2000 мс (в вашем случае) истекает без каких-либо данных.

Какая опция должна быть активирована до блокировки?

Существует не тот, который должен быть включен. Если вы имеете в виду "может быть включен", это один из них.

Бесконечные таймауты, которые сокет больше не читает?

Какое странное предложение. Это означает, что если данные никогда не появятся, вы будете блокировать чтение навсегда.

Ответ 3

В этом примере все ясно для меня:
Как вы видите, setSoTimeout не позволяет программе висеть! Он ждет времени SO_TIMEOUT! если он не получает никакого сигнала, он бросает исключение! Это означает, что время истекло!

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;

public class SocketTest extends Thread {
  private ServerSocket serverSocket;

  public SocketTest() throws IOException {
    serverSocket = new ServerSocket(8008);
    serverSocket.setSoTimeout(10000);
  }

  public void run() {
    while (true) {
      try {
        System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
        Socket client = serverSocket.accept();

        System.out.println("Just connected to " + client.getRemoteSocketAddress());
        client.close();
      } catch (SocketTimeoutException s) {
        System.out.println("Socket timed out!");
        break;
      } catch (IOException e) {
        e.printStackTrace();
        break;
      }
    }
  }

  public static void main(String[] args) {
    try {
      Thread t = new SocketTest();
      t.start();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}