Java-nio-datagram-channel

提供:Dev Guides
移動先:案内検索

Java NIO-データグラムチャネル

Java NIOデータグラムは、接続レスプロトコルを介してUDPパケットを送受信できるチャネルとして使用されます。デフォルトでは、データグラムチャネルは、非ブロッキングモードで使用できる一方でブロックされます。非ブロッキングにするために、configureBlocking( false)method.DataGramチャネルは、* open()*という名前の静的メソッドの1つを呼び出すことにより開くことができます。このメソッドは、IPアドレスをパラメーターとして取得し、マルチキャストに使用できます。

FileChannelと同様のデータグラムチャネルは、接続するためにデフォルトでは接続されませんが、connect()メソッドを明示的に呼び出す必要がありますが、接続する必要があるときに送信メソッドと受信メソッドを使用するために、データグラムチャネルを接続する必要はありません読み取りおよび書き込みメソッドを使用するため。これらのメソッドはソケットアドレスを受け入れたり返したりしないためです。

データグラムチャネルの接続状態は、* isConnected()*メソッドを呼び出すことで確認できます。接続されると、データグラムチャネルは切断または閉じられるまで接続されたままになります。データグラムチャネルはスレッドセーフであり、マルチスレッドと同時実行を同時にサポートします。

データグラムチャネルの重要な方法

  • * bind(SocketAddress local)*-このメソッドは、データグラムチャネルのソケットを、このメソッドのパラメーターとして提供されるローカルアドレスにバインドするために使用されます。
  • * connect(SocketAddress remote)*-このメソッドは、ソケットをリモートアドレスに接続するために使用されます。
  • * disconnect()*-このメソッドは、リモートアドレスへのソケットを切断するために使用されます。
  • * getRemoteAddress()*-このメソッドは、チャネルのソケットが接続されているリモートロケーションのアドレスを返します。
  • * isConnected()*-すでに述べたように、このメソッドはデータグラムチャネルの接続状態、つまり接続されているかどうかを返します。
  • * open()およびopen(ProtocolFamilyファミリ)*-プロトコルファミリとして表される複数のアドレスのパラメータ化されたオープンメソッドオープンチャネルに対して、オープンメソッドは単一アドレスのデータグラムチャネルを開きます。
  • * read(ByteBuffer dst)*-このメソッドは、データグラムチャネルを介して指定されたバッファからデータを読み取るために使用されます。
  • * receive(ByteBuffer dst)*-このメソッドは、このチャネルを介してデータグラムを受信するために使用されます。
  • * send(ByteBuffer src、SocketAddress target)*-このメソッドは、このチャネルを介してデータグラムを送信するために使用されます。

次の例は、Java NIO DataGramChannelからデータを送信する方法を示しています。

サーバー:DatagramChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelServer {
   public static void main(String[] args) throws IOException {
      DatagramChannel server = DatagramChannel.open();
      InetSocketAddress iAdd = new InetSocketAddress("localhost", 8989);
      server.bind(iAdd);
      System.out.println("Server Started: " + iAdd);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
     //receive buffer from client.
      SocketAddress remoteAdd = server.receive(buffer);
     //change mode of buffer
      buffer.flip();
      int limits = buffer.limit();
      byte bytes[] = new byte[limits];
      buffer.get(bytes, 0, limits);
      String msg = new String(bytes);
      System.out.println("Client at " + remoteAdd + "  sent: " + msg);
      server.send(buffer,remoteAdd);
      server.close();
   }
}

出力

Server Started: localhost/127.0.0.1:8989

クライアント:DatagramChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelClient {
   public static void main(String[] args) throws IOException {
      DatagramChannel client = null;
      client = DatagramChannel.open();

      client.bind(null);

      String msg = "Hello World!";
      ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
      InetSocketAddress serverAddress = new InetSocketAddress("localhost",
        8989);

      client.send(buffer, serverAddress);
      buffer.clear();
      client.receive(buffer);
      buffer.flip();

      client.close();
   }
}

出力

クライアントを実行すると、サーバーに次の出力が出力されます。

Server Started: localhost/127.0.0.1:8989
Client at/127.0.0.1:64857  sent: Hello World!