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 } } } }
上記のコードは、Nio の具体的な作業プロセスに関する書籍のコード例です。その作業プロセスは次のように詳細に説明できます:
2 つの主要なクラスがあります: Channel と Selector は、NIO の中核概念です。チャネルは交通手段にたとえることができ、車や自転車などの具体的な交通手段のことです。 Selector は、車両の運行状況と特定の配車作業を監視する役割を担う配車システムにたとえることができます。
serverSocketChannel クラスは、ストリーム指向のリスニング ソケットのオプションのチャネルです。サーバーがそのようなインスタンスを作成した後、Socket() メソッドを通じて ServerSocket を返します (このチャネルに関連付けられたサーバー ソケットを取得します)。クラスを作成し、このインスタンスの void binding(SocketAddress endpoint) メソッドを使用して ServerSocket
を特定のアドレス (IP アドレスとポート番号) にバインドします。タクシー会社のすべてのタクシーを会社に登録する必要があるのと同様に、register() メソッドを使用して指定されたセレクターに ServerSocketChannel インスタンスを登録する必要もあります。
次に、Selector の selectedKeys メソッドを呼び出して、このセレクターに登録されているすべての通信チャネルに必要なイベントがあるかどうかを確認します。特定のイベントが発生すると、key.readyOps() により準備完了の操作セットが取得され、すべての SelectionKeys が返されます。したがって、key.readyOps()&SelectionKey.OP_ACCEPT は、このキーの準備完了操作セットが ACCEPT 状態、つまりサーバーがリッスン状態にあり、この通信が可能であることを意味すると個人的には考えています。このオブジェクト Channel オブジェクトの Channel メソッドを通じて取得し、accept() メソッドを呼び出して、デフォルトでブロックされているソケット チャネルを返します。また、Channel メソッドで取得した通信チャネル オブジェクトを使用して通信データを読み取ることもできます。ここで読み取られるデータは Buffer です。この Buffer は制御可能なバッファです。
以上がNioの具体的な動作プロセスのサンプルコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。