Die Antwort ist: Sie können nicht.
Die erste Sache zu verstehen ist, wie eine TCP-Verbindung funktioniert. Der Kernel sendet SYN-Pakete, wodurch die Zeit zwischen den Wiederholungen zurückgesetzt wird. Dies kann über Kernel-Parameter eingestellt werden. Ein Artikel über diese im Detail (für Linux) kann here
Ihnen eine Vorstellung zu finden geben, was ist beteiligt Ihr eigenes kürzer Timeout für eine Buchse zu implementieren verbinden wird, um die Buchse in nicht-blockierenden Modus zu versetzen, werfen Sie es in a select()
mit einer Zeitüberschreitung, dann verwenden Sie getsockopt()
, um zu sehen, was passiert ist. This StackOverflow answer zeigt, wie das funktioniert.
Mit NIO.2 wird der Verbindungsprozess für Sie mit Threads behandelt, auf die Sie keinen Zugriff haben. Leider gibt es keine Möglichkeit zu sagen, dass Sie eine kürzere Zeitüberschreitung bei Verbindungen wünschen. Es ruft nur Ihren Beendigungshandler auf/benachrichtigt die Future
, wenn die Verbindung entweder fehlschlägt (einschließlich Zeitüberschreitung).
Sie haben tun die Möglichkeit, get(timeout, unit)
auf dem zurück Future
ruft, dann ist die Future
wenn es Cancelling mal aus ... aber das bedeutet, wenn Sie die Verbindungs sein wollen async Sie eine weitere Schicht von threading/Rückrufe hinzuzufügen haben und kann auch einfach dein eigenes async-ding mit nio implementieren.
Eine letzte Sache erwähnenswert, da man bei Asynchron-Netzwerk Sachen suchen ist, ist, dass Netty Sie dies nicht geben (mit Nio):
Bootstrap bootstrap = new Bootstrap()
.group(new NioEventLoopGroup())
.channel(NioSocketChannel.class)
.remoteAddress(new InetSocketAddress(remoteAddress, port))
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout);
ChannelFuture f = bootstrap.connect();
Und Sie einen Zuhörer mit diesen ChannelFuture
für einen Rückruf registrieren .
Timeouts sind für blockierende Operationen. Dies ist eine asynchrone Operation. Die Frage ergibt keinen Sinn. – EJP
@EJP - es macht aus der Perspektive nicht ewig warten, um zu wollen für eine Steckdose selbst zu verbinden, wenn Sie Ihre Operationen async sind. Das heißt, es ist schwierig, auch in C zu tun. Sie müssen 'select()' mit einem Timeout mit dem Socket im nicht blockierenden Modus verwenden. Ich müsste wirklich herausfinden, wie man das mit NIO2 macht - vielleicht ist das nicht möglich, wenn man abstrahiert, wie alles weg von dir ist. –
@Brian Es gibt kein "ewig warten". Das standardmäßige Verbindungstimeout beträgt plattformabhängig etwa eine Minute. Mir ist bewusst, wie man es im blockierenden und nicht blockierenden Modus macht, danke, und ich stimme Ihrer Aussage in Ihrer Antwort unten zu, dass Sie angesichts der vorhandenen Java-APIs nicht im asynchronen Modus arbeiten können. Sie sollten einen Timeout-Parameter an die connect-Methode zur Verfügung gestellt, so dass die 'CompletionHandler' früher genannt bekommen konnte (unter Hinweis darauf, dass das, was Technik, die Sie auf welcher Ebene auch immer verwenden, können Sie nur die Verbindungs Timeout verringern, nicht erhöhen). – EJP