it-swarm.com.de

Was ist die Funktionalität von setSoTimeout und wie funktioniert es?

Ich versuche, Socket selbst zu lernen. Ich bin ein bisschen verwirrt, wenn ich dem Text von der Oracle-Website folge. Ich habe einige Fragen dazu. Vielen Dank im Voraus für jede klare Erklärung.

setSoTimeout

public void setSoTimeout (int timeout) löst SocketException aus

Aktivieren/Deaktivieren Sie SO_TIMEOUT mit dem angegebenen Zeitlimit in Millisekunden. Wenn diese Option auf ein Timeout ungleich Null eingestellt ist, wird ein read() -Aufruf für das InputStream, das diesem Socket zugeordnet ist, nur für diese Zeitspanne blockiert. Wenn das Timeout abläuft, wird ein Java.net.SocketTimeoutException wird ausgelöst, obwohl der Socket noch gültig ist. Die Option muss vor dem Aufrufen des Sperrvorgangs aktiviert werden, damit sie wirksam wird. Das Timeout muss> 0 sein. Ein Timeout von Null wird als unendliches Timeout interpretiert.

  1. Was ist SO_TIMEOUT?
  2. Socket ist der Endpunkt einer Verbindung. Wenn ich sage

    mySocket.setSoTimeout(2000);
    

    Bedeutet dies, dass ich das Lesen von Eingaben vom Server/Client für diesen Socket für 2000 Millisekunden blockiere und der Socket nach dieser Zeit bereit ist, Daten zu lesen?

  3. Was bedeutet es, dass das Timeout abläuft?

  4. Welche Option muss vor dem Sperren des Betriebs aktiviert werden?

  5. Infinite Timeout bedeutet, dass der Socket nicht mehr liest?

45
Bernard

Das JavaDoc erklärt es sehr gut:

Wenn diese Option auf ein Timeout ungleich Null festgelegt ist, wird ein read () -Aufruf für den mit diesem Socket verknüpften InputStream nur für diese Zeitspanne blockiert. Wenn das Timeout abläuft, wird eine Java.net.SocketTimeoutException ausgelöst, obwohl das Socket noch gültig ist. Die Option muss vor dem Aufrufen des Sperrvorgangs aktiviert werden, damit sie wirksam wird. Das Timeout muss> 0 sein. Ein Timeout von Null wird als unendliches Timeout interpretiert.

SO_TIMEOUT Ist die Zeitüberschreitung, die ein read()-Aufruf blockiert. Wenn das Timeout erreicht ist, wird eine Java.net.SocketTimeoutException ausgelöst. Wenn Sie diese Option für immer blockieren möchten, setzen Sie sie auf Null (Standardwert), dann wird der Aufruf von read() blockiert, bis mindestens 1 Byte gelesen werden konnte.

30
logoff

Bedeutet dies, dass ich das Lesen von Eingaben vom Server/Client für diesen Socket für 2000 Millisekunden blockiere und der Socket nach dieser Zeit bereit ist, Daten zu lesen?

Nein, wenn innerhalb von 2000 ms keine Daten eingehen, wird ein SocketTimeoutException geworfen.

Was bedeutet es, dass das Timeout abläuft?

Dies bedeutet, dass die 2000 ms (in Ihrem Fall) vergehen, ohne dass Daten eintreffen.

Welche Option muss vor dem Sperren des Betriebs aktiviert werden?

Es gibt keinen, der aktiviert sein muss. Wenn Sie "möglicherweise aktiviert" meinen, ist dies einer von ihnen.

Infinite Timeout-Menüs, die der Socket nicht mehr liest?

Was für ein seltsamer Vorschlag. Dies bedeutet, dass Sie den Lesevorgang für immer blockieren, wenn keine Daten eingehen.

35
user207421

Dieses Beispiel hat mir alles klar gemacht:
Wie Sie sehen, verhindert setSoTimeout, dass das Programm hängt! Es wartet auf SO_TIMEOUT Zeit! Wenn es kein Signal bekommt, wirft es eine Ausnahme! Es bedeutet, dass die Zeit abgelaufen ist!

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();
    }
  }
}
12
Bernard