モジュール java.base
パッケージ java.net

クラスDatagramSocket

java.lang.Object
java.net.DatagramSocket
すべての実装されたインタフェース:
Closeable, AutoCloseable
直系の既知のサブクラス:
MulticastSocket

public class DatagramSocket extends Object implements Closeable
このクラスは、データグラム・パケットを送受信するためのソケットを表します。

データグラム・ソケットは、パケット配信サービスの送信点または受信点です。 データグラム・ソケット上で送信または受信する各パケットは、それぞれ異なるアドレスで経路を指定されます。 あるマシンから別のマシンに複数のパケットを送信する場合、各パケットは異なる経路で送信される可能性があり、宛先には任意の順序で到達する可能性があります。

可能な場合、新しく構築されたDatagramSocketは、ブロードキャスト・データグラムの転送を許可するためにSO_BROADCASTソケット・オプションを有効にします。 ブロードキャスト・パケットを受信するときは、DatagramSocketをワイルドカード・アドレスにバインドするようにしてください。 実装によっては、DatagramSocketが特定のアドレスにバインドされていてもブロードキャスト・パケットを受信する場合もあります。

例:


              DatagramSocket s = new DatagramSocket(null);
              s.bind(new InetSocketAddress(8888));
 
これは、次のことに相当します:

              DatagramSocket s = new DatagramSocket(8888);
 
どちらの場合も、UDPポート8888でブロードキャストを受信できるDatagramSocketは作成します。

DatagramSocketクラスは、複数のソケット・オプションを設定および取得するための便利なメソッドを定義します。 このクラスは、ソケット・オプションを設定および問合せするsetOptionメソッドとgetOptionメソッドも定義します。 DatagramSocketでは、次のソケット・オプションがサポートされます:

ソケット・オプション
オプション名 説明
SO_SNDBUF ソケット送信バッファのサイズ(バイト単位)
SO_RCVBUF ソケット受信バッファのサイズ(バイト単位)
SO_REUSEADDR アドレスを再利用します
SO_BROADCAST ブロードキャスト・データグラムの転送を許可します
IP_TOS IP (Internet Protocol)ヘッダーのサービス・タイプ(ToS)オクテット

また、DatagramSocketクラスは、マルチキャスト・グループ「結合」およびleaveへのメソッドを定義し、「マルチキャスト・オプション」をサポートします。これは、「結合」leavingまたはマルチキャスト・グループへのデータグラムの送信時に役立ちます。 次のマルチキャスト・オプションがサポートされています:

マルチキャスト・オプション
オプション名 説明
IP_MULTICAST_IF IP (Internet Protocol)マルチキャスト・データグラムのネットワーク・インタフェース
IP_MULTICAST_TTL IP (Internet Protocol)マルチキャスト・データグラムの有効期間
IP_MULTICAST_LOOP IP (Internet Protocol)マルチキャスト・データグラムのループ・バック
実装は、追加のオプションをサポートする場合もあります。

APIのノート:
「DatagramSocketを使用したマルチキャスト」

DatagramChannelは、MulticastChannelインタフェースを実装し、マルチキャスト・データグラムを送受信するための代替APIを提供します。 MulticastChannel APIは、any-sourcesource-specificの両方のマルチキャストをサポートしています。 マルチキャストにDatagramChannelを使用することを検討してください。

DatagramSocketは、マルチキャストに直接使用できます。 ただし、MulticastSocketと対照的に、DatagramSocketはデフォルトでSO_REUSEADDRソケット・オプションを有効にするためにsetReuseAddress(boolean)メソッドを呼び出しません。 後でマルチキャスト・グループに参加することを目的としたDatagramSocketを作成する場合、呼出し元はSO_REUSEADDRオプションを明示的に有効化することを検討する必要があります。

DatagramSocketのインスタンスは、マルチキャスト・データグラム・パケットの送受信に使用できます。 マルチキャスト・データグラムを送信するためにマルチキャスト・グループに参加する必要はありません。 ただし、マルチキャスト・データグラム・パケットを送信する前に、マルチキャスト・データグラムを送信するデフォルトの送信インタフェースを最初にsetOptionおよびStandardSocketOptions.IP_MULTICAST_IFを使用して構成する必要があります:


    DatagramSocket sender = new DatagramSocket(new InetSocketAddress(0));
    NetworkInterface outgoingIf = NetworkInterface.getByName("en0");
    sender.setOption(StandardSocketOptions.IP_MULTICAST_IF, outgoingIf);

    // optionally configure multicast TTL; the TTL defines the scope of a
    // multicast datagram, for example, confining it to host local (0) or
    // link local (1) etc...
    int ttl = ...; // a number between 0 and 255
    sender.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl);

    // send a packet to a multicast group
    byte[] msgBytes = ...;
    InetAddress mcastaddr = InetAddress.getByName("228.5.6.7");
    int port = 6789;
    InetSocketAddress dest = new InetSocketAddress(mcastaddr, port);
    DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, dest);
    sender.send(hi);
 

DatagramSocketのインスタンスを使用して、マルチキャスト・データグラム・パケットを受信することもできます。 マルチキャスト・データグラムを受信する目的で作成されたDatagramSocketは、「バインドなし」を作成する必要があります。 ソケットをバインドする前に、setReuseAddress(true)を構成する必要があります:


    DatagramSocket socket = new DatagramSocket(null); // unbound
    socket.setReuseAddress(true); // set reuse address before binding
    socket.bind(new InetSocketAddress(6789)); // bind

    // joinGroup 228.5.6.7
    InetAddress mcastaddr = InetAddress.getByName("228.5.6.7");
    InetSocketAddress group = new InetSocketAddress(mcastaddr, 0);
    NetworkInterface netIf = NetworkInterface.getByName("en0");
    socket.joinGroup(group, netIf);
    byte[] msgBytes = new byte[1024]; // up to 1024 bytes
    DatagramPacket packet = new DatagramPacket(msgBytes, msgBytes.length);
    socket.receive(packet);
    ....
    // eventually leave group
    socket.leaveGroup(group, netIf);
 

プラットフォームの依存性

マルチキャスト実装は、ネイティブ・マルチキャスト機能に直接マッピングすることを目的としています。 そのため、IPマルチキャスト・データグラムを受信するアプリケーションの開発時には、次の項目を考慮するべきです。

  1. DatagramChannelと対照的に、DatagramSocketのコンストラクタでは、基礎となるソケットのProtocolFamilyを指定することはできません。 そのため、基礎となるソケットのプロトコル・ファミリは、DatagramSocketが参加しようとするマルチキャスト・グループのプロトコル・ファミリに対応していない可能性があります。
    あるプロトコル・ファミリで作成された基礎となるソケットを持つDatagramSocketが、マルチキャスト・グループのアドレスが別のプロトコル・ファミリに対応する場合に、マルチキャスト・データグラムを結合および受信できるという保証はありません。
    たとえば、IPv6ソケットへのDatagramSocketがIPv4マルチキャスト・グループに参加でき、グループに送信されるマルチキャスト・データグラムを受信できる場合は、実装に固有です。
  2. マルチキャスト・グループに参加する前に、DatagramSocketをワイルドカード・アドレスにバインドする必要があります。 ソケットが、ワイルドカード・アドレスではなく特定のアドレスにバインドされている場合、ソケットがマルチキャスト・データグラムを受信するかどうかは実装によって異なります。
  3. SO_REUSEADDRオプションは、ソケットをバインドする前に有効にしてください。 これは、グループの複数のメンバーを同じアドレスにバインドできるようにするために必要です。

導入されたバージョン:
1.0
関連項目: