Java réseau: evented Socket/InputStream
Je me suis mise en œuvre d'un événement couche orientée sur Java de Sockets, et je me demandais si il y avait un moyen pour déterminer si les données en attente de lecture.
Mon approche normale serait de lire à partir de la socket dans un tampon, et d'appeler la condition des rappels lorsque la mémoire tampon est rempli au cours d'une certaine quantité d'octets (qui peut être 0, si la fonction de rappel doit être déclenché à chaque fois que quelque chose arrive), mais je soupçonne que Java est déjà la mise en mémoire tampon pour moi.
Est le available()
méthode de InputStream fiable pour cela? Dois-je simplement read()
et de faire ma propre mise en mémoire tampon sur le dessus de la Douille? Ou est-il un autre moyen?
Vous devez vous connecter pour publier un commentaire.
Peu non.
available()
n'est pas fiable (au moins, il n'était pas pour moi). Je recommande d'utiliserjava.nio.channels.SocketChannel
connecté avecSelector
etSelectionKey
. Cette solution est un peu l'événement, mais c'est plus compliqué que de simples supports.Pour les clients:
socket
), ouvrir un sélecteur (selector = Selector.open();
).socket.configureBlocking(false);
socket.register(selector, SelectionKey.OP_CONNECT);
socket.connect(new InetSocketAddress(host, port));
selector.select();
OP_READ
; si le "nouveau" se réfère aux données disponibles, il suffit de lire à partir de la douille.Cependant, afin d'avoir asynchrone, vous devez configurer un thread séparé (en dépit de la prise en cours de création en tant que non-bloqué, le thread va bloquer toute façon) qui vérifie si quelque chose est arrivé ou pas.
Pour les serveurs, il n'y a
ServerSocketChannel
et que vous utilisezOP_ACCEPT
pour elle.Pour la référence, c'est mon code (client), devrait vous donner un indice:
Et pour le serveur:
Espère que cette aide.
disponible() va seulement vous dire si vous pouvez lire les données sans passer par l'OS. Son pas très utile ici.
Vous pouvez soit faire un blocage, ou de non-blocage de lire que vous préférez. Un non-blocage de lire en retourne quand il n'y a pas de données à lire, de sorte que peut-être ce que vous voulez.