JAVA-NIOのSocket/ServerSocket Chanel(詳しくは)


一、ServerSocketChanel
Java NIOのServerSocketChanelは、標準IOのServerSocketのように、新しく入ったTCP接続を傍受できるチャネルです。ServerSocketChanel類はjava.nio.cnnelsのカバンの中にあります。
ServerSocketChanelを開く
ServerSocketChane.openを呼び出してServer SocketChanelを開く。
ServerSocketChanelを閉じます。
ServerSocketChanel.closeを呼び出すことにより、Server SocketChanelを閉じる。
新しく入った接続を傍受します。
ServerSocketChanel.accept()方法により、新しく入った接続を傍受する。accept()方法が戻ると、新しい接続を含むSocketChanelに戻ります。そのため、accept()方法は新しい接続が到着するまでブロックされます。
通常は一つの接続だけをモニターしないで、whileサイクルの中でaccept()メソッドを呼び出します。
もちろん、whileループではtrue以外の脱退基準を使用しても良いです。
非ブロッキングモード
ServerSocketChanelは非ブロッキングモードに設定できます。ブロックモードでないと、accept()方法はすぐに戻ります。もしまだ新しい接続がないなら、戻ってくるのはnullです。したがって、戻ってきたSocketChanelがnullかどうかを確認する必要があります。

/**
   * socket server channel
   */
  @Test
  public void text2() throws IOException {
    ServerSocketChannel channel = ServerSocketChannel.open();  //  channel
    channel.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());    //  
      }
    }
  }
二、SocketChanel
Java NIOの中のSocketChanelはTCPネットワークソケットに接続する通路です。以下の2つの方法でSocketChanelを作成できます。
SocketChanelを開いてインターネット上のサーバーに接続します。
新しい接続がServerSocketChanelに到着すると、SocketChanelが作成されます。
SocketChanelを開く
以下はSocketChanelの開き方です。
SocketChanelを閉じる
SocketChanelを使用した後、SocketChanel.closeを呼び出し、SocketChanelをクローズする:
SocketChannelからデータを読み出す
SocketChannelからデータを読み込むには、readを呼び出す方法の一つです。
まず、Bufferを一つ割り当てます。SocketChanelから読み取ったデータはこのBufferに入ります。
その後、SocketChannel.readを呼び出します。この方法は、データをSocketChanelからBufferに読み出す。read()メソッドの戻り値は、何バイトを読んだかを示しています。戻りが−1である場合は、ストリームの最後まで読んだことを示す(接続が閉じられている)。
SocketChanelに書き込む
データをSocketChanelに書くには、一つのBufferをパラメータとして使用するSocketChanel.write方法があります。
注意SocketChanell.writeメソッドの呼び出しは一つのwhileサイクルにあります。Write()方法では、どのぐらいのバイトがSocketChanelに書けるか保証できません。ですから、私たちはWriteを呼び出します。Bufferが書くバイトがないまで繰り返します。
非ブロッキングモード
SocketChanelを非ブロッキングモードに設定できます。設定後、非同期モードでconnect()、read()、write()を呼び出すことができます。
connect()
もし、SocketChanelが非閉塞モードである場合、このときconnectを呼び出すと、この方法は接続が確立される前に戻ってくるかもしれない。接続が確立されているかを確認するために、finishConnect()を呼び出す方法があります。
write()
ブロックモードではなく、write()メソッドはまだ何も書かれていない時に戻ってくるかもしれません。サイクル中にwrite()を呼び出す必要があります。前に例がありましたが、ここでは詳しく説明しません。
read()
ブロッキングモードではない場合、read()方法は、まだ何のデータも読み込まれていないときに戻ります。そのためには、どのぐらいのバイトが読み取られているかを教えてくれます。
非ブロッキングモードとセレクタ
非ブロッキングモードとセレクタの組み合わせがより良く、1つ以上のSocketChanelをSelectorに登録することで、どのチャンネルが準備されているかを確認することができます。SelectorとSocketChanelの組み合わせは後で詳しく説明します。

/**
   * socket channel
   */
  @Test
  public void test3() throws IOException {
    SocketChannel channel = SocketChannel.open();                //     
    channel.connect(new InetSocketAddress("127.0.0.1",9999));  //       
    ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //   
    byteBuffer.put("123".getBytes());
    byteBuffer.flip();                 //  
    while (byteBuffer.hasRemaining()) {         //  
      channel.write(byteBuffer);
    }
  }
以上のこのJAVA-NIOのSocket/ServerSocket Chanelは小编が皆さんに共有している内容です。参考にしていただければと思います。どうぞよろしくお愿いします。