Wie soll ich AsynchronousServerSocketChannel für die Annahme von verbindungen?
Möchte ich schreiben, eine asynchrone server mit Java 7 und NIO 2.
Aber wie soll ich AsynchronousServerSocketChannel
?
E. g. wenn ich starte mit:
final AsynchronousServerSocketChannel server =
AsynchronousServerSocketChannel.open().bind(
new InetSocketAddress(port));
Dann, wenn ich server.accept()
das Programm beendet da dieser Aufruf ist asynchrone. Und wenn ich den code in einer Endlosschleife, ein AcceptPendingException
geworfen wird.
Irgendwelche Vorschläge auf, wie man eine einfache asynchrone server mit AsynchronousServerSocketChannel
?
Hier mein vollständiges Beispiel (ähnlich wie das Beispiel in der JavaDoc):
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class AsyncServer {
public static void main(String[] args) {
int port = 8060;
try {
final AsynchronousServerSocketChannel server =
AsynchronousServerSocketChannel.open().bind(
new InetSocketAddress(port));
System.out.println("Server listening on " + port);
server.accept("Client connection",
new CompletionHandler<AsynchronousSocketChannel, Object>() {
public void completed(AsynchronousSocketChannel ch, Object att) {
System.out.println("Accepted a connection");
//accept the next connection
server.accept("Client connection", this);
//handle this connection
//TODO handle(ch);
}
public void failed(Throwable exc, Object att) {
System.out.println("Failed to accept connection");
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
- Sie können Netty-framework, das speziell für client-server-Anwendung. Es verwendet auch java NIO. Es ist eine einfache und schnelle Entwicklung von server. gehen Sie über netty.io
- Ich weiß, über netty, das ist aber nicht relevant für diese Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie auf der richtigen Spur, Aufruf von accept() aus dem abgeschlossenen Rückruf, um zu akzeptieren, mehr verbindungen funktionieren sollte.
Einer einfachen (aber hässlich) Weg zu verhindern, dass den thread zu beenden ist einfach eine Schleife, bis der thread unterbrochen wird.
Sauberer ist die Verwendung
AsynchronousChannelGroup
. Zum Beispiel:Können Sie abstimmen, wie threads verarbeitet werden, finden Sie in der AsynchronousChannelGroup API-docs für weitere Informationen.
// yes, sleep() is evil, but sometimes I don't care
Sie kümmern sollte.Asynchrone akzeptieren ist nützlich, wenn Sie etwas anderes zu tun in dem gleichen thread. In den Fall, Sie nicht etwas anderes tun, so würde ich
AsynchronousServerSocketChannel
.CompletionHandler
und es automatisch überwacht verbindungen zu akzeptieren.AsynchronousServerSocketChannel
undServerSocketChannel
?Andere alternative ist es, Ihre main-Methode wartet auf ein signal, bevor er zurückkehrt. Dann wenn Sie irgendeine Art von externen Befehl shutdown, den Sie nur Benachrichtigen Sie das signal-und der main-thread beendet.
Verwenden Sie count-down-Verriegelung, wie im folgenden Beispiel