Frage Festlegen eines Zeitlimits für Socket-Vorgänge


Wenn ich einen Socket erstelle:

Socket socket = new Socket(ipAddress, port);

Es wird eine Ausnahme ausgelöst, die in Ordnung ist, da die IP-Adresse nicht verfügbar ist. (Die Testvariablen wo String ipAddress = "192.168.0.3" und int port = 300.)

Das Problem ist: Wie setze ich es auf Timeout für diesen Sockel?

Wie reduziere ich die Zeit, bevor ich einen Socket erstelle? UnknownHostException und bekomme den Socket auf Timeout?


75
2018-02-11 13:51


Ursprung


Antworten:


Benutze die Socket() Konstrukteur, und connect(SocketAddress endpoint, int timeout) Methode stattdessen.

In Ihrem Fall würde es ungefähr so ​​aussehen:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);

Zitat aus der Dokumentation

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException

Verbindet diesen Socket mit einem angegebenen Timeout-Wert mit dem Server. Ein Timeout von Null wird als unendliches Timeout interpretiert. Die Verbindung wird dann blockiert, bis festgestellt wird oder ein Fehler auftritt.

Parameter:

endpoint - die Socketadresse
timeout - Der Zeitüberschreitungswert, der in Millisekunden verwendet werden soll.

Wirft:

IOException - wenn während der Verbindung ein Fehler auftritt
SocketTimeoutException - Wenn das Timeout vor dem Verbinden abläuft
IllegalBlockingModeException - Wenn dieser Socket einen zugehörigen Kanal hat und der Kanal sich im nicht blockierenden Modus befindet
IllegalArgumentException - Wenn der Endpunkt Null ist oder eine SocketAddress-Unterklasse von diesem Socket nicht unterstützt wird

Schon seit:          1.4


136
2018-02-11 13:54



Sie legen kein Timeout für den Socket fest, Sie legen ein Timeout für den Operationen Sie führen auf diesem Sockel.

Beispielsweise socket.connect(otherAddress, timeout)

Oder socket.setSoTimeout(timeout) um eine Zeitüberschreitung festzulegen read() Operationen.

Sehen: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html


40
2018-02-11 13:54



Sie könnten die folgende Lösung verwenden:

SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);

Ich hoffe es hilft!


18
2018-02-11 13:58



Sie können die Zeitüberschreitung nicht steuern UnknownHostException. Dies sind DNS-Timings. Sie können das Verbindungstimeout nur bei einem gültigen Host steuern. Keine der vorhergehenden Antworten adressiert diesen Punkt richtig.

Aber ich finde es schwer zu glauben, dass du wirklich einen bekommst UnknownHostException wenn Sie eine IP-Adresse anstelle eines Hostnamens angeben.

BEARBEITEN Um die DNS-Timeouts von Java zu kontrollieren Siehe diese Antwort.


8
2018-03-20 09:12



Benutze die Standardkonstruktor für Socket und dann verwenden Sie die connect () -Methode.


5
2018-02-11 13:54