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 } } } }
Der obige Code ist ein Codebeispiel aus dem Buch über den spezifischen Arbeitsprozess von Nio. Sein Arbeitsablauf kann im Detail wie folgt beschrieben werden:
Es gibt zwei Schlüsselklassen: Kanal und Selektor , sie sind Kernkonzepte in NIO. Der Kanal kann mit einem Transportmittel verglichen werden und ist ein bestimmtes Transportmittel wie Autos und Fahrräder. Der Selector kann mit einem Fahrzeugdispositionssystem verglichen werden, das für die Überwachung der Fahrzeugbetriebsbedingungen und spezifischer Dispositionsarbeiten verantwortlich ist.
Die serverSocketChannel-Klasse ist ein optionaler Kanal für Stream-orientierte Listening-Sockets. Nachdem eine solche Instanz auf der Serverseite erstellt wurde, ruft die Socket()-Methode (die diesem Kanal zugeordneten Informationen ab ) Server Socket) gibt eine Instanz der ServerSocket-Klasse zurück und verwendet die Methode void bind(SocketAddress endpoint) dieser Instanz, um ServerSocket
an eine bestimmte Adresse (IP-Adresse und Portnummer) zu binden. So wie jedes Taxi in einem Taxiunternehmen beim Unternehmen registriert sein muss, müssen wir auch die ServerSocketChannel-Instanz über die Methode register() beim angegebenen Selektor registrieren.
Rufen Sie dann die selectedKeys-Methode von Selector auf, um zu überprüfen, ob alle auf diesem Selektor registrierten Kommunikationskanäle über die erforderlichen Ereignisse verfügen. Wenn ein Ereignis auftritt, werden alle Ereignisse zurückgegeben, da der Schlüssel vorhanden ist .readyOps() erhält den Bereitschaftsoperationssatz dieses Schlüssels. Ich persönlich denke, dass key.readyOps()&SelectionKey.OP_ACCEPT bedeutet, dass sich der Bereitschaftsoperationssatz dieses Schlüssels im ACCEPT-Zustand befindet, d. h Der Server befindet sich im Überwachungsstatus. Das Kommunikationskanalobjekt kann über die Channel-Methode dieses Objekts abgerufen werden. Anschließend wird die Methode „accept()“ aufgerufen, um einen Socket-Kanal zurückzugeben, der standardmäßig den Blockierungsstatus verwendet Durch die Channel-Methode erhaltenes Kanalobjekt zum Lesen der Kommunikationsdaten. Die hier gelesenen Daten sind Puffer, und dieser Puffer ist ein Puffer, den wir steuern können.
Das obige ist der detaillierte Inhalt vonBeispielcode zum spezifischen Arbeitsprozess von Nio. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!