ホームページ  >  記事  >  Java  >  JAVA-7NIOのソケット/サーバーソケットチャネル

JAVA-7NIOのソケット/サーバーソケットチャネル

巴扎黑
巴扎黑オリジナル
2017-06-26 09:58:01998ブラウズ

1. ServerSocketChannel

Java NIO の ServerSocketChannel は、標準 IO の ServerSocket と同様に、新しい受信 TCP 接続を監視できるチャネルです。 ServerSocketChannel クラスは java.nio.channels パッケージにあります。

ServerSocketChannel を開く

ServerSocketChannel.open() メソッドを呼び出して ServerSocketChannel を開きます。

ServerSocketChannel を閉じる

ServerSocketChannel.close() メソッドを呼び出して ServerSocketChannel を閉じます

新しい受信接続をリッスンします

ServerSocketC。 hannel.accept() メソッドがリッスンします新しい着信接続の場合。 accept() メソッドが戻ると、新しい受信接続を含む SocketChannel が返されます。したがって、accept() メソッドは、新しい接続が到着するまでブロックされます。

通常、while ループ内で 1 つの接続をリッスンして accept() メソッドを呼び出すだけではありません

もちろん、while ループ内で true 以外の他の終了基準を使用することもできます。

ノンブロッキングモード

ServerSocketChannelはノンブロッキングモードに設定できます。非ブロッキング モードでは、新しい受信接続がない場合、accept() メソッドはすぐに戻り値は null になります。 したがって、返された SocketChannel が null かどうかを確認する必要があります。例:

    /** * 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());       //输出            }
        }
    }

2. Java NIO の SocketChannel

SocketChannel は、TCP ネットワークソケットに接続されているチャネルです。 SocketChannel は次の 2 つの方法で作成できます:

  1. SocketChannel を開き、インターネット上のサーバーに接続します。

  2. 新しい接続が ServerSocketChannel に到着すると、SocketChannel が作成されます。 E ソケットチャネルを開きます

  3. 以下はソケットチャネルを開く方法です:

SocketChannelを閉じる

ソケットチャネルを使用する場合、socketChannel.close()を呼び出してソケットチャネルを閉じます:

SocketChannelからsocketChannelへデータを読み込みます。 CKETChannel データの場合は、read() メソッドの 1 つを呼び出します。

まず、バッファを割り当てます。 SocketChannel から読み取られたデータは、このバッファーに配置されます。

次に、SocketChannel.read()を呼び出します。このメソッドは、SocketChannel から Buffer にデータを読み取ります。 read() メソッドによって返される int 値は、バッファに読み取られたバイト数を示します。 -1 が返された場合は、ストリームの終わりが読み取られた (接続が閉じられた) ことを意味します。

SocketChannel への書き込み

SocketChannel へのデータの書き込みには、パラメーターとして Buffer を取る SocketChannel.write() メソッドが使用されます。

SocketChannel.write() メソッドが while ループで呼び出されることに注意してください。 Write() メソッドは、SocketChannel に書き込めるバイト数を保証できません。したがって、バッファに書き込むバイトがなくなるまで、 write() を繰り返し呼び出します。

ノンブロッキングモード

SocketChannel をノンブロッキングモードに設定すると、非同期モードで connect()、read()、write() を呼び出すことができます。

connect()

SocketChannel がノンブロッキング モードで、この時点で connect() が呼び出された場合、接続が確立される前にメソッドが戻る可能性があります。接続が確立されているかどうかを確認するには、finishConnect() メソッドを呼び出します。

write()

ノンブロッキング モードでは、コンテンツが書き込まれる前に write() メソッドが返されることがあります。したがって、ループ内で write() を呼び出す必要があります。以前にも例がありましたので、ここでは詳しく説明しません。

read()

ノンブロッキングモードでは、データが読み取られる前に read() メソッドが返されることがあります。したがって、読み取られたバイト数を示す int 戻り値に注意する必要があります。

ノンブロッキング モードとセレクター

ノンブロッキング モードは、セレクターに 1 つ以上の SocketChannel を登録することで、どのチャネルが読み取り、書き込みなどの準備ができているかをセレクターに問い合わせることができます。 Selector と SocketChannel の組み合わせについては後で詳しく説明します。

りー

以上がJAVA-7NIOのソケット/サーバーソケットチャネルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。