Maison >Java >javaDidacticiel >JAVA-7NIO : canal Socket/ServerSocket
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 en appelant la méthode ServerSocketChannel.open().
Fermez-le en appelant la méthode ServerSocketChannel.close() ServerSocketChannel .
É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. .
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()); //输出 } } }
SocketChannel dans Java NIO. est un canal A connecté à une socket réseau TCP. SocketChannel peut être créé des 2 manières suivantes :
Ouvrez un SocketChannel et connectez-vous à un serveur sur Internet.
Lorsqu'une nouvelle connexion arrive à ServerSocketChannel, un SocketChannel est créé.
Voici comment ouvrir SocketChannel :
Appelez SocketChannel.close lorsque vous avez terminé avec SocketChannel ()Fermez 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).
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.
Vous pouvez définir SocketChannel en mode non bloquant (mode non bloquant, vous pouvez appeler connect(), read() et write() dans). mode asynchrone.
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().
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.
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.
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!