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 stelle ich das Timeout für diesen Socket ein?
Wie reduziere ich beim Erstellen des Sockets die Zeit, bevor ich einen erhalte, UnknownHostException
und stelle fest, dass der Socket eine Zeitüberschreitung aufweist?
Antworten:
Verwenden Sie stattdessen den
Socket()
Konstruktor und dieconnect(SocketAddress endpoint, int timeout)
Methode .In Ihrem Fall würde es ungefähr so aussehen:
Zitat aus der Dokumentation
quelle
socket.setSoTimeout(timeoutMillis)
beim Blockieren von E / A-Vorgängen Zeitüberschreitungen zu fordern .Sie legen kein Zeitlimit für den Socket fest, sondern ein Zeitlimit für die Vorgänge, die Sie an diesem Socket ausführen.
Beispielsweise
socket.connect(otherAddress, timeout)
Oder
socket.setSoTimeout(timeout)
um ein Zeitlimit fürread()
Vorgänge festzulegen .Siehe: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
quelle
socket.setSoTimeout
dass AFTER aufgerufen werden mussconnect
, da dies sonst keine Auswirkungen hat und das Lesen niemals abläuft. Dies ist eine schlecht dokumentierte Gotcha.Sie können die folgende Lösung verwenden:
Ich hoffe es hilft!
quelle
connect()
Methode behoben , jedoch nicht unter der Kontrolle eines Timeouts.Sie können das Timeout aufgrund von nicht steuern
UnknownHostException
. Dies sind DNS-Timings. Sie können das Verbindungszeitlimit nur bei einem gültigen Host steuern. Keine der vorhergehenden Antworten spricht diesen Punkt richtig an.Aber ich finde es schwer zu glauben, dass Sie wirklich eine bekommen,
UnknownHostException
wenn Sie eine IP-Adresse anstelle eines Hostnamens angeben.BEARBEITEN Um die DNS-Zeitüberschreitungen von Java zu steuern, lesen Sie diese Antwort .
quelle
Verwenden Sie den Standardkonstruktor für Socket und anschließend die Methode connect () .
quelle