2010-04-01 11 views
5

Die Verwendung von nicht-blockierende I/O, den Code an eine entfernte Adresse für die Verbindung sieht ungefähr so ​​aus:Verbindungs-Timeout in java.nio Geben

SocketChannel channel = SelectorProvider.provider().openSocketChannel(); 
channel.configureBlocking(false); 
channel.connect(address); 

Der Verbindungsprozess wird dann durch den Aufruf beendet haben werden finishConnect() auf der Kanal, wenn irgendein Selektor den entsprechenden Schlüssel isConnectable() sagt.

Gibt es eine Möglichkeit, das Verbindungstimeout anzugeben, wenn dieses Idiom verwendet wird?

Antwort

0

Interessante Frage. Ich bin mir nicht sicher, dass nio selbst eine Lösung bietet.

Nach meiner Erfahrung habe ich eine Callable ausgeführt, um die Verbindung zu versuchen, und dann die Zukunft verwendet, um eine Antwort abzufragen, wobei 'interval' und 'timeout' Variablen in loop und Thread.sleep() für eine Antwort verwendet werden .

Hoffentlich, die Sie in eine nützliche Richtung zeigt ...

Auch empfehle ich Ihnen einen Blick auf Apache Mina nehmen (Sie Mina als nio Rahmen beschreiben könnte). Es behandelt eine Menge von dieser Art von Material für Sie, zum Beispiel in der StreamIoHandler http://mina.apache.org/report/trunk/apidocs/org/apache/mina/handler/stream/StreamIoHandler.html

1

Der Frage wirklich keinen Sinn macht. Timeouts sind für den Sperrmodus. Wenn Sie das wollen, lassen Sie den Kanal im Sperrmodus und rufen Sie channel.socket().connect(address, timeout);. Wenn Sie den nicht blockierenden Modus verwenden möchten, verwenden Sie Ihren aktuellen Code. dann erstelle einen Selektor; Registrieren Sie den Kanal für OP_CONNECT; Wenn Sie es erhalten rufen Sie finishConnect(), und wenn das wahr zurückgibt, melden Sie sich OP_CONNECT und fahren Sie mit dem Rest Ihres Codes.

Verwandte Themen