Quelles options pour async io (basé sur les sockets) existe-t-il dans Java autre que java.nio? Java.nio utilise-t-il également des threads en arrière-plan (comme le pense la bibliothèque async-socket de .NET, peut-être a-t-il été modifié) ou est-il "vrai" asynchrone utilisant un bon appel de sélection?
Réponses
Trop de publicités?Java NIO paquet (de Java6), fournit le support pour les non-blocage I/O , via le Sélecteur des. Java7, je l'espère, navire à NIO.2, qui comprend asynchronous I/O support. Aujourd'hui, votre meilleur pari est de rendre l'utilisation d'un framework. ARMistice mentionné Mina. Voici quelques autres.
- Grizzly. C'est le I/O de base pour Sun GlassFish server. Grizzly offre un mécanisme pour faire asynchrone des lectures/écritures (par l'intermédiaire d'un modèle de file d'attente). Il prend en charge les protocoles TCP et UDP une comme. J'ai utilisé Grizzly dans un ou deux projets. Il y a des choses que j'aime et n'aime pas le cadre, mais pour les détails c'est vraiment un autre sujet. Je dirais que c'est assez facile d'obtenir quelque chose qui fonctionne et Grizzly fait beaucoup de levage lourd pour vous.
- Netty. Ce projet vient de l'un des auteurs de l'article original sur le Mina projet. Je n'ai pas l'habitude de ce si je ne sais pas à propos de son soutien pour asynchronous I/o, Vous devriez jeter un oeil.
Maintenant, en ce qui concerne votre question à propos des threads, NIO Sélecteurs de ne pas utiliser les threads pour les non-blocage I/O. Dans JDK6 ils utiliser select() sous Windows et epoll installation sur les nouveaux noyaux Linux. Pour asynchronous I/O, le filetage de détails dépendent du cadre.
JAVA 7 est arrivé, alors la nouvelle réponse est NIO.2 avec la classe Future. Exemple :
Côté serveur:
final AsynchronousServerSocketChannel serverSocket=
AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection
Future<AsynchronousSocketChannel> future= serverSocket.accept();
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled()
//Do whatever you wan't ..
InputStream stream = Channels.newInputStream(clientSocket) (...)
Du côté du client:
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();
//Send something
OutputStream os = Channels.newOutputStream(clientChannel );
os.write (...)
Une autre suggestion concernant les bibliothèques serait Naga ( http://naga.googlecode.com ). C'est un peu moins comme un framework et plus comme une bibliothèque. Il essaie de ressembler davantage aux sockets java ordinaires, si c'est votre tasse de thé. C'est minimaliste comparé à Grizzly, Mina et Netty.
java.nio
n'est qu'un paquet - une collection de classes "stupides" - en lui-même, il n'utilise aucune utilisation de threads. Lorsqu'il est utilisé correctement, comme dans le modèle de conception de Reactor , vous pouvez obtenir une E / S asynchrone correcte, entièrement évolutive.