Maison  >  Article  >  Java  >  JAVA-7NIO : canal Socket/ServerSocket

JAVA-7NIO : canal Socket/ServerSocket

巴扎黑
巴扎黑original
2017-06-26 09:58:011022parcourir

1. ServerSocketChannel

ServerSocketChannel dans Java NIO est un canal qui peut surveiller les nouvelles connexions TCP entrantes, tout comme ServerSocket dans IO standard. La classe ServerSocketChannel se trouve dans le package java.nio.channels.

Ouvrez ServerSocketChannel

Ouvrez ServerSocketChannel en appelant la méthode ServerSocketChannel.open().

Fermez ServerSocketChannel

Fermez-le en appelant la méthode ServerSocketChannel.close() ServerSocketChannel .

Écoutez les nouvelles connexions entrantes

Écoutez les nouvelles connexions entrantes via la méthode ServerSocketChannel.accept(). Lorsque la méthode accept() est renvoyée, elle renvoie un SocketChannel contenant la nouvelle connexion entrante. Par conséquent, la méthode accept() se bloquera jusqu’à l’arrivée d’une nouvelle connexion.

Habituellement, vous n'écoutez pas seulement une connexion et appelez la méthode accept() dans la boucle while

Bien sûr, vous pouvez également utiliser d'autres critères de sortie que true dans la boucle while. .

Mode non bloquant

ServerSocketChannel peut être défini en mode non bloquant. En mode non bloquant, la méthode accept() retournera immédiatement s'il n'y a pas de nouvelle connexion entrante, la valeur de retour sera nulle. Par conséquent, vous devez vérifier si le SocketChannel renvoyé est nul. Par exemple :

    /** * socket server channel     */@Testpublic void text2() throws IOException {
        ServerSocketChannel channel = ServerSocketChannel.open();    //新建channelchannel.socket().bind(new InetSocketAddress(9999));     //监听端口channel.configureBlocking(true);                             //设置阻塞while (true) {
            SocketChannel accept = channel.accept();                    //设置为阻塞,则此方法阻塞,直到有连接//如果设置为非阻塞,需要在这里判断 accept == null?ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
            accept.read(byteBuffer);
            byteBuffer.flip();                                    //反转while (byteBuffer.hasRemaining()) {                   //判断System.err.println((char)byteBuffer.get());       //输出            }
        }
    }

2. SocketChannel

SocketChannel dans Java NIO. est un canal A connecté à une socket réseau TCP. SocketChannel peut être créé des 2 manières suivantes :

  1. Ouvrez un SocketChannel et connectez-vous à un serveur sur Internet.

  2. Lorsqu'une nouvelle connexion arrive à ServerSocketChannel, un SocketChannel est créé.

Ouvrez SocketChannel

Voici comment ouvrir SocketChannel :

Fermez SocketChannel

Appelez SocketChannel.close lorsque vous avez terminé avec SocketChannel ()Fermez SocketChannel :

Lire les données de SocketChannel

Pour lire les données de SocketChannel, appelez l'une des méthodes read().

Tout d’abord, allouez un tampon. Les données lues depuis SocketChannel seront placées dans ce Buffer.

Ensuite, appelez SocketChannel.read(). Cette méthode lit les données de SocketChannel dans Buffer. La valeur int renvoyée par la méthode read() indique combien d'octets ont été lus dans le Buffer. Si -1 est renvoyé, cela signifie que la fin du flux a été lue (la connexion a été fermée).

Écrire sur SocketChannel

L'écriture de données sur SocketChannel utilise la méthode SocketChannel.write(), qui prend un Buffer comme paramètre.

Notez que la méthode SocketChannel.write() est appelée dans une boucle while. La méthode Write() ne peut pas garantir le nombre d'octets pouvant être écrits dans SocketChannel. Nous appelons donc write() à plusieurs reprises jusqu'à ce que le Buffer n'ait plus d'octets à écrire.

Mode non bloquant

Vous pouvez définir SocketChannel en mode non bloquant (mode non bloquant, vous pouvez appeler connect(), read() et write() dans). mode asynchrone.

connect()

Si SocketChannel est en mode non bloquant et que connect() est appelé à ce moment-là, la méthode peut revenir avant que la connexion ne soit établie. Pour déterminer si la connexion est établie, vous pouvez appeler la méthode finishConnect().

write()

En mode non bloquant, la méthode write() peut revenir avant d'écrire quoi que ce soit. Donc write() doit être appelé dans la boucle. Il y a eu des exemples auparavant, je n’entrerai donc pas dans les détails ici.

read()

En mode non bloquant, la méthode read() peut revenir avant que les données n'aient été lues. Vous devez donc faire attention à sa valeur de retour int, qui vous indiquera combien d'octets ont été lus.

Mode non bloquant et sélecteur

Le mode non bloquant fonctionnera mieux avec le sélecteur En enregistrant un ou plusieurs SocketChannels sur le sélecteur, vous pouvez demander au sélecteur quel canal est prêt. Ok lecture, écriture. etc. La combinaison de Selector et SocketChannel sera discutée en détail plus tard.

/** * socket channel     */@Testpublic void test3() throws IOException {
        SocketChannel channel = SocketChannel.open();                               //新建服务端channel.connect(new InetSocketAddress("127.0.0.1",9999));   //连接服务端地址ByteBuffer byteBuffer = ByteBuffer.allocate(1024);  //缓冲区byteBuffer.put("123".getBytes());
        byteBuffer.flip();                                  //反转while (byteBuffer.hasRemaining()) {                 //判断            channel.write(byteBuffer);
        }
    }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn