NIOの典型的なプログラミングモード

1.サーバー 

輸入java.net.InetSocketAddress;
インポートたjava.nio.ByteBuffer;
輸入いるjava.nio.channels *。;
インポートするjava.util.Iterator;
輸入java.util.Set;

パブリック クラスNIOServer {
     公共 静的 ボイドメイン(文字列[]引数)がスロー例外{
         // 1のServerSocketChannel作成 
        AのServerSocketChannelのServerSocketChannel = ServerSocketChannel.open();
         // オブジェクトセレクタ作成 
        セレクタセレクタ= Selector.openを();
         // ネクタイ聞くために、サーバー上のポートを与え 
        serverSocketChannel.socket()バインド(新新たInetSocketAddress(8888 ));
         // 非ブロッキングに設定 
        serverSocketChannel.configureBlocking();
         //セレクタに登録のServerSocketChannel、当該イベントOP_ACCEPT 
        serverSocketChannel.register(セレクタ、SelectionKey.OP_ACCEPT)。

        // クライアント接続を待ってループ
        しながら真の){
             IF(selector.select(1000)== 0){   // 1秒間のサーバ待ち、接続なし 
                1秒間のSystem.out.println(「サーバー待機、...コネクションを。 " );
                 続行します
            }
            // イベント、とSelectionKeyのそこチャンネルのイベントを取得する 
            設定<とSelectionKey> selectedKeys = selector.selectedKeys();

            // イベントチャネルとSelectionKeyにより取得された逆

            イテレータ <とSelectionKey> keyIterator = selectedKeys.iterator();
             一方(keyIterator.hasNext()){
                 // イベントの発生とSelectionKeyを取得した後、対応するチャネルの種類が決定され、次いで別を行います処理 
                とSelectionKeyとSelectionKey = ; keyIterator.next()
                 IF {(selectionKey.isAcceptable())// イベントが接続されている場合、接続する新しいクライアントを示す
                     // クライアントのSocketChannelへの作成 
                    のSocketChannelのSocketChannel = ServerSocketChannel.acceptを();
                    socketChannel.configureBlocking();
                    System.out.println(「クライアントの接続が成功すると、SocketChannelへの生成:」+ socketChannel.hashCode());
                     //は、セレクタにSocketChannelへの登録団体にのSocketChannelバッファ与えながら、興味のあるイベントは、OP_READある 
                    socketChannel.register(セレクタ、SelectionKey.OP_READ、ByteBuffer.allocate(1024 ))。
                }
                IF(selectionKey.isReadable()){   // 読み出しイベント 
                    のSocketChannelのSocketChannel = (のSocketChannel)selectionKey.channel();
                     // 関連するチャネルのバッファを取得 
                    ByteBufferのバッファ= (のByteBuffer)selectionKey.attachment();
                     // チャネルにデータは、バッファ読み取り
                    socketChannel.read(バッファ)。
                    System.out.println( "クライアントデータが受信された:" + 新新しい文字列(buffer.array()));
                }
                // それ以外の場合は繰り返されます、コレクションから削除さとSelectionKey、処理後の
                keyIterator.removeを();
            }
        }
    }
}

 

 

 

2.クライアント 

インポートにjava.io.IOException;
輸入java.net.InetSocketAddress;
輸入java.net.SocketAddress;
インポートたjava.nio.ByteBuffer;
輸入java.nio.channels.SocketChannel;

パブリック クラスNIOClient {
     公共 静的 ボイドメイン(文字列[]引数)がスローにIOExceptionが{
         // チャネル得 
        たSocketChannel =たSocketChannel SocketChannel.openを();
         // セットノンブロッキングモード 
        socketChannel.configureBlocking(偽の);
         // サービス終了IPおよび終了 
        のSocketAddressアドレス= 新しい新たInetSocketAddress(「127.0.0.1」、8888 )。

        // 接続サーバ、接続を返す成功した場合はtrue、そうでない場合はfalseを返す
        ブール connectResult = SocketChannel.connect(アドレス);
         IF(!ConnectResultは){ // 接続が失敗し
            ながら、 {(socketChannel.finishConnect()!)// さらに接続の場合完了していない 
                のSystem.out.printlnは(「接続に時間がかかるため、クライアントはブロックされません...他のことを行うことができます..」);
            }
        }
        // 成功した場合、送信データ 
        文字列データ=「Hello World」の
        ByteBufferのバッファ = ByteBuffer.wrap(data.getBytesを());
         // 送信データ、データはバッファ・チャネルに書き込まれ
        socketChannel.write(バッファ)。

        // プログラムを閉じてみましょう
        )(System.in.readを。

    }
}

 

おすすめ

転載: www.cnblogs.com/z-qinfeng/p/11963446.html