Maison >Java >javaDidacticiel >Exemple de code sur le processus de travail spécifique de Nio

Exemple de code sur le processus de travail spécifique de Nio

零下一度
零下一度original
2017-07-03 11:20:211663parcourir
 1 public void selector() throws IOException { 2     
 ByteBuffer buffer = ByteBuffer.allocate(1024); 3     
 Selector selector = Selector.open(); 4     
 ServerSocketChannel ssc = ServerSocketChannel.open(); 5     
 ssc.configureBlocking(false);//设置为非阻塞模式 6     
 ssc.socket().bind(new InetSocketAddress(8080)); 7     
 ssc.register(selector, SelectionKey.OP_ACCEPT);//注册监听事件 8     
 while(true) { 9         Set selectorKeys = selector.selectorKeys();
 //取得所有key的集合10         Iterator it = selectorKeys.iterator();11         
 while(it.hasNext()) { //检查序列是否还有元素12             
 SelectionKey key = (SelectionKey) it.next();13             
 if((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {14                 
 ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();15                 
 SocketChannel sc = ssChannel.accept();//接受到服务端的请求16                 
 sc.configureBlocking(false);17                 
 sc.register(selector,SelectionKey.OP_ACCEPT);18                 
 it.remove();19             } 
 else if((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {20                 
 SocketChannel sc = (SocketChannel) key.channel;21                 
 while(true) {22                     buffer.clear();23                     
 int n = sc.read(buffer);//读取数据24                     
 if(n <= 0) {25                         
 break;26                     }                     
 buffer.flip();28                 }                
 it.remove();30             }    
 }
 }
 }

  Le code ci-dessus est un exemple de code tiré du livre sur le processus de travail spécifique de Nio. Son processus de fonctionnement peut être décrit en détail comme suit :

Il existe deux classes clés : Canal et sélecteur , ce sont des concepts fondamentaux dans NIO. Le canal peut être comparé à un moyen de transport, et il s'agit d'un moyen de transport spécifique, comme les voitures et les vélos. Le Selector peut être comparé à un système de répartition de véhicules, chargé de surveiller les conditions de fonctionnement des véhicules et les travaux de répartition spécifiques.

La classe serverSocketChannel est un canal optionnel pour les sockets d'écoute orientées flux. Après avoir créé une telle instance côté serveur, utilisez la méthode Socket() (récupérez les informations associées à ce canal). Server Socket) renvoie une instance de la classe ServerSocket et utilise la méthode void bind(SocketAddress endpoint) de cette instance pour lier ServerSocket à une adresse spécifique (adresse IP et numéro de port). Tout comme chaque taxi d'une compagnie de taxi doit être enregistré auprès de l'entreprise, nous devons également enregistrer l'instance ServerSocketChannel auprès du sélecteur spécifié via la méthode register().

Appelez ensuite la méthode selectedKeys de Selector pour vérifier si tous les canaux de communication enregistrés sur ce sélecteur ont les événements requis. Si un événement se produit, tous les événements seront renvoyés SelectionKey, depuis la clé. .readyOps() obtient l'ensemble d'opérations prêt de cette clé, je pense personnellement que key.readyOps()&SelectionKey.OP_ACCEPT signifie que l'ensemble d'opérations prêt de cette clé est dans l'état ACCEPT, c'est-à-dire le Le serveur est dans l'état d'écoute, l'objet canal de communication peut être obtenu via la méthode Channel de cet objet, puis la méthode accept() est appelée pour renvoyer un canal socket, qui est par défaut dans un état de blocage. Vous pouvez également utiliser la communication. objet canal obtenu par la méthode Channel pour lire les données de communication, et Les données lues ici sont Buffer, et ce Buffer est un tampon que nous pouvons contrôler.


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