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

クラスMulticastSocket

java.lang.Object
java.net.DatagramSocket
java.net.MulticastSocket
すべての実装されたインタフェース:
Closeable, AutoCloseable

public class MulticastSocket extends DatagramSocket
MulticastSocketは、IPマルチキャスト・データグラムの送受信に便利なデータグラム・ソケットです。 MulticastSocketコンストラクタは、マルチキャスト・データグラムの受信に適した適切なソケット・オプションを有効にしてソケットを作成します。 MulticastSocketクラスは、マルチキャスト・アプリケーションで一般的に使用されるソケット・オプションの便利なsetterメソッドとgetterメソッドをさらに定義します。

1つ以上のマルチキャスト・グループに参加すると、これらのグループに送信されたマルチキャスト・データグラムを受信できます。

IPv4マルチキャスト・グループは、クラスD IPアドレスと標準のUDPポート番号によって指定されます。 クラスD IPアドレスの範囲は、224.0.0.0から239.255.255.255までです。 アドレス224.0.0.0は予約されており、使用できません。

まず、目的のポートでMulticastSocketを作成し、次にjoinGroupメソッドを起動して、グループ・アドレスとマルチキャスト・データグラムを受信するネットワーク・インタフェースを指定します:


 // join a Multicast group and send the group salutations
 ...
 String msg = "Hello";
 InetAddress mcastaddr = InetAddress.getByName("228.5.6.7");
 InetSocketAddress group = new InetSocketAddress(mcastaddr, 6789);
 NetworkInterface netIf = NetworkInterface.getByName("bge0");
 MulticastSocket s = new MulticastSocket(6789);

 s.joinGroup(new InetSocketAddress(mcastaddr, 0), netIf);
 byte[] msgBytes = msg.getBytes(StandardCharsets.UTF_8);
 DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, group);
 s.send(hi);
 // get their responses!
 byte[] buf = new byte[1000];
 DatagramPacket recv = new DatagramPacket(buf, buf.length);
 s.receive(recv);
 ...
 // OK, I'm done talking - leave the group...
 s.leaveGroup(group, netIf);
 
マルチキャスト・グループにメッセージを送信すると、そのホストとポートのすべての参加者がメッセージを受け取ります(ただしパケットの有効期間内に限られる。詳細は後述)。 マルチキャスト・グループにメッセージを送信するためには、ソケットがそのマルチキャスト・グループのメンバーである必要はありません。

ソケットがマルチキャスト・グループまたはポートに参加すると、ほかのホストからそのグループまたはポートに送信されたデータグラムを受信することができます。そのグループとポートの他のメンバーもすべて同じデータグラムを受信します。 ソケットは、leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)メソッドによってグループ内のメンバーシップを放棄します。 「複数MulticastSockets」は、マルチキャスト・グループとポートを同時にサブスクライブでき、すべてのグループ・データグラムを受信します。

DatagramSocketクラスおよびMulticastSocketクラスは、いくつかのソケット・オプションを設定および取得するための便利なメソッドを定義しています。 このクラスは、DatagramSocketと同様、ソケット・オプションを設定および問合せするためのsetOptionおよびgetOptionメソッドもサポートしています。 サポートされているソケット・オプションのセットは、DatagramSocketで定義されます。 追加(実装固有)のオプションをサポートできる場合もあります。

APIのノート:
DatagramSocketは、マルチキャスト・データグラムの送受信に直接使用できます。 DatagramChannelは、MulticastChannelインタフェースを実装し、マルチキャスト・データグラムを送受信するための代替APIを提供します。 MulticastChannel APIは、any-sourceおよびsource-specificの両方のマルチキャストをサポートしています。 マルチキャストにDatagramChannelを使用することを検討してください。
導入されたバージョン:
1.1
  • コンストラクタの詳細

    • MulticastSocket

      public MulticastSocket() throws IOException
      マルチキャスト・ソケットを構築し、ローカル・ホスト・マシン上の使用可能なポートにバインドします。 ソケットはwildcardアドレスにバインドされます。

      セキュリティ・マネージャが存在する場合、この操作が許可されるように、最初にそのcheckListenメソッドが0を引数に指定して呼び出されます。 この結果、SecurityExceptionがスローされることがあります。

      ソケットが作成されると、SO_REUSEADDRソケット・オプションを有効にするために、DatagramSocket.setReuseAddress(boolean)メソッドが呼び出されます。

      例外:
      IOException - MulticastSocketの作成中に入出力例外が発生した場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckListenメソッドでこの操作が許可されていない場合。
      関連項目:
    • MulticastSocket

      public MulticastSocket(int port) throws IOException
      マルチキャスト・ソケットを構築し、ローカル・ホスト・マシン上の指定されたポートにバインドします。 ソケットはwildcardアドレスにバインドされます。

      セキュリティ・マネージャが存在する場合、この操作が許可されるように、最初にそのcheckListenメソッドがport引数をその引数として指定して呼び出されます。 この結果、SecurityExceptionがスローされることがあります。

      ソケットが作成されると、SO_REUSEADDRソケット・オプションを有効にするために、DatagramSocket.setReuseAddress(boolean)メソッドが呼び出されます。

      パラメータ:
      port - 使用するポート
      例外:
      IOException - MulticastSocketの作成中に入出力例外が発生した場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckListenメソッドでこの操作が許可されていない場合。
      IllegalArgumentException - ポートが「範囲外です。」の場合
      関連項目:
    • MulticastSocket

      public MulticastSocket(SocketAddress bindaddr) throws IOException
      指定されたローカル・ソケット・アドレスにバインドされたマルチキャスト・ソケットを作成します。

      アドレスがnullの場合、バインドされていないソケットが作成されます。

      セキュリティ・マネージャが存在する場合、最初にそのcheckListenメソッドがSocketAddressポートを引数に指定して呼び出され、この操作が許可されるかどうかが確認されます。 この結果、SecurityExceptionがスローされることがあります。

      ソケットが作成されると、SO_REUSEADDRソケット・オプションを有効にするために、DatagramSocket.setReuseAddress(boolean)メソッドが呼び出されます。

      パラメータ:
      bindaddr−バインドするソケット・アドレス。アンバウンドのソケットの場合はnull
      例外:
      IOException - MulticastSocketの作成中に入出力例外が発生した場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckListenメソッドでこの操作が許可されていない場合。
      導入されたバージョン:
      1.4
      関連項目:
  • メソッドの詳細

    • setTTL

      @Deprecated public void setTTL(byte ttl) throws IOException
      非推奨。
      かわりにsetTimeToLive(int)メソッドを使用します。これは、ttlのタイプとしてbyteのかわりにintを使用します。
      マルチキャストのスコープを制御するために、このMulticastSocketから送信されるマルチキャスト・パケットのデフォルトの有効期間を設定します。

      ttlは符号なし8ビット・データなので、0 <= ttl <= 0xFFの範囲でなければいけません

      パラメータ:
      ttl - 有効期間
      例外:
      IOException - デフォルトの有効期間値の設定中に入出力例外が発生した場合
      関連項目:
    • setTimeToLive

      public void setTimeToLive(int ttl) throws IOException
      マルチキャストのスコープを制御するために、このMulticastSocketから送信されるマルチキャスト・パケットのデフォルトの有効期間を設定します。

      ttlの範囲は 0 <= ttl <= 255でなければいけません。そうでない場合は、IllegalArgumentExceptionがスローされます。 TTLが0で送信されたマルチキャスト・パケットは、ネットワークでは転送されませんが、ローカルで転送されることがあります。

      APIのノート:
      このメソッドは、setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl)のコールと同等です。
      パラメータ:
      ttl - 有効期間
      例外:
      IOException - デフォルトの有効期間値の設定中に入出力例外が発生した場合
      導入されたバージョン:
      1.2
      関連項目:
    • getTTL

      @Deprecated public byte getTTL() throws IOException
      非推奨。
      かわりにgetTimeToLive()メソッドを使用し、byteのかわりにintを返します。
      このソケットから送信されるマルチキャスト・パケットのデフォルトの有効期間を取得します。
      戻り値:
      デフォルトの有効期間値
      例外:
      IOException - デフォルトの有効期間値の取得中に入出力例外が発生した場合
      関連項目:
    • getTimeToLive

      public int getTimeToLive() throws IOException
      このソケットから送信されるマルチキャスト・パケットのデフォルトの有効期間を取得します。
      APIのノート:
      このメソッドは、getOption(StandardSocketOptions.IP_MULTICAST_TTL)のコールと同等です。
      戻り値:
      デフォルトの有効期間値
      例外:
      IOException - デフォルトの有効期間値の取得中に入出力例外が発生した場合
      導入されたバージョン:
      1.2
      関連項目:
    • joinGroup

      @Deprecated(since="14") public void joinGroup(InetAddress mcastaddr) throws IOException
      非推奨。
      このメソッドは、マルチキャスト・グループに参加するネットワーク・インタフェースを受け入れません。 代わりにjoinGroup(SocketAddress, NetworkInterface)を使用してください。
      あるマルチキャスト・グループに参加します。 その動作は、setInterfaceまたはsetNetworkInterfaceの影響を受ける可能性があります。

      セキュリティ・マネージャが存在する場合、このメソッドは最初に、mcastaddrを引数に指定してcheckMulticastメソッドを呼び出します。

      APIのノート:
      このメソッドの呼出しは、joinGroup(new InetSocketAddress(mcastaddr, 0), null)の呼出しと同じです。
      パラメータ:
      mcastaddr - 参加するマルチキャスト・アドレス
      例外:
      IOException - 結合にエラーが発生した場合、またはアドレスがマルチキャスト・アドレスでない場合、またはプラットフォームがマルチキャストをサポートしていない場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckMulticastメソッドが参加を許可しない場合。
      関連項目:
    • leaveGroup

      @Deprecated(since="14") public void leaveGroup(InetAddress mcastaddr) throws IOException
      非推奨。
      このメソッドは、マルチキャスト・グループから脱退するネットワーク・インタフェースを受け入れません。 代わりにleaveGroup(SocketAddress, NetworkInterface)を使用してください。
      あるマルチキャスト・グループから離れます。 その動作は、setInterfaceまたはsetNetworkInterfaceの影響を受ける可能性があります。

      セキュリティ・マネージャが存在する場合、このメソッドは最初に、mcastaddrを引数に指定してcheckMulticastメソッドを呼び出します。

      APIのノート:
      このメソッドの呼出しは、leaveGroup(new InetSocketAddress(mcastaddr, 0), null)の呼出しと同じです。
      パラメータ:
      mcastaddr - 離れるマルチキャスト・アドレス
      例外:
      IOException - 離れる際にエラーが発生した場合、またはアドレスがマルチキャスト・アドレスでない場合。
      SecurityException - セキュリティ・マネージャが存在し、そのcheckMulticastメソッドでこの操作が許可されていない場合。
      関連項目:
    • joinGroup

      public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
      あるマルチキャスト・グループに参加します。

      マルチキャスト・グループに参加するには、コール元が参加するマルチキャスト・グループのIPアドレスを指定し、マルチキャスト・パケットを受信するローカル「ネットワーク・インタフェース」を指定する必要があります。

      • mcastaddr引数は、結合するマルチキャスト・グループのIPアドレスを示します。 履歴上の理由から、これはSocketAddressとして指定されます。 デフォルトの実装はInetSocketAddressのみをサポートし、port情報は無視されます。
      • netIf引数は、マルチキャスト・データグラム・パケットを受信するローカル・インタフェース、または送信マルチキャスト・データグラムのインタフェース・セットに遅延するnullを指定します。 nullで、インタフェースが設定されていない場合、動作は指定されません: インタフェースが選択されているか、操作がSocketExceptionで失敗する可能性があります。

      このメソッドを複数回呼び出して、複数の異なるマルチキャスト・グループを結合するか、複数の異なるネットワークで同じグループに参加することができます。 ただし、ソケットがすでにグループのメンバーである場合は、IOExceptionがスローされます。

      セキュリティ・マネージャが存在する場合、このメソッドは最初に、mcastaddrを引数に指定してcheckMulticastメソッドを呼び出します。

      オーバーライド:
      クラスDatagramSocketjoinGroup
      パラメータ:
      mcastaddr - 、参加するマルチキャスト・アドレスを示します。
      netIf - マルチキャスト・データグラム・パケットを受信するローカル・インタフェース、またはnullを指定します。
      例外:
      IOException - 結合にエラーが発生した場合、またはアドレスがマルチキャスト・アドレスでない場合、またはプラットフォームがマルチキャストをサポートしていない場合
      SecurityException - セキュリティ・マネージャが存在し、そのcheckMulticastメソッドが参加を許可しない場合。
      IllegalArgumentException - mcastaddrがnullであるか、このソケットでサポートされないSocketAddressサブクラスである場合
      導入されたバージョン:
      1.4
      関連項目:
    • leaveGroup

      public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
      指定されたローカル・インタフェース上のマルチキャスト・グループから離れます。

      セキュリティ・マネージャが存在する場合、このメソッドは最初に、mcastaddrを引数に指定してcheckMulticastメソッドを呼び出します。

      オーバーライド:
      クラスDatagramSocketleaveGroup
      APIのノート:
      mcastaddrおよびnetIf引数は、このDatagramSocketによって以前に「結合」であったマルチキャスト・グループを識別する必要があります。

      このメソッドを複数回呼び出して複数の異なるマルチキャスト・グループが以前に結合されたままになるか、同じグループを複数の異なるネットワークで以前に結合されたままにしておくことができます。 ただし、ソケットが指定されたネットワーク内の指定されたグループのメンバーでない場合、IOExceptionがスローされます。

      パラメータ:
      mcastaddr - 離れるマルチキャスト・アドレス これには、グループの「結合」に使用されるものと同じIPアドレスが含まれている必要があります。
      netIf - 送信マルチキャスト・データグラムのインタフェース・セットに遅延するローカル・インタフェースまたはnullを指定します。 nullで、インタフェースが設定されていない場合、動作は指定されません: インタフェースが選択されているか、操作がSocketExceptionで失敗する可能性があります。
      例外:
      IOException - 離れる際にエラーが発生した場合、またはアドレスがマルチキャスト・アドレスでない場合。
      SecurityException - セキュリティ・マネージャが存在し、そのcheckMulticastメソッドでこの操作が許可されていない場合。
      IllegalArgumentException - mcastaddrがnullの場合、またはこのソケットでサポートされないSocketAddressサブクラスである場合。
      導入されたバージョン:
      1.4
      関連項目:
    • setInterface

      @Deprecated(since="14") public void setInterface(InetAddress inf) throws SocketException
      非推奨。
      InetAddressではネットワーク・インタフェースを一意に識別できない場合があります。 代わりにsetNetworkInterface(NetworkInterface)を使用してください。
      ネットワーク・インタフェースの値によってその動作が影響をうけるメソッドが使用する、マルチキャスト・ネットワーク・インタフェースを設定します。 マルチホームのホストに便利です。
      パラメータ:
      inf − InetAddress
      例外:
      SocketException - 使用しているプロトコルでエラー(TCPエラーなど)が発生した場合。
      関連項目:
    • getInterface

      @Deprecated(since="14") public InetAddress getInterface() throws SocketException
      非推奨。
      ネットワーク・インタフェースは、戻されたInetAddressによって一意に識別されない場合があります。 代わりにgetNetworkInterface()を使用してください。
      マルチキャスト・パケットに使用するネットワーク・インタフェースのアドレスを取得します。
      戻り値:
      マルチキャスト・パケットに使用されるネットワーク・インタフェースのアドレスを表すInetAddress。または、インタフェースが設定されていない場合は、すべてのローカル・アドレスを表すInetAddressです。
      例外:
      SocketException - 使用しているプロトコルでエラー(TCPエラーなど)が発生した場合。
      関連項目:
    • setNetworkInterface

      public void setNetworkInterface(NetworkInterface netIf) throws SocketException
      このソケットから送信される送出マルチキャスト・データグラム用のネットワーク・インタフェースを指定します。
      APIのノート:
      このメソッドは、setOption(StandardSocketOptions.IP_MULTICAST_IF, netIf)のコールと同等です。
      パラメータ:
      netIf−インタフェース
      例外:
      SocketException - 使用しているプロトコルでエラー(TCPエラーなど)が発生した場合。
      導入されたバージョン:
      1.4
      関連項目:
    • getNetworkInterface

      public NetworkInterface getNetworkInterface() throws SocketException
      このソケットから送信された送信マルチキャスト・データグラムのマルチキャスト・ネットワーク・インタフェース・セットを取得します。
      APIのノート:
      インタフェースが設定されている場合、このメソッドはgetOption(StandardSocketOptions.IP_MULTICAST_IF)の呼出しと同じです。
      戻り値:
      マルチキャストNetworkInterfaceは現在設定されています。 プレースホルダーNetworkInterfaceは、インタフェースが設定されていない場合に返されます。ローカル・アドレスを表すInetAddressは1つのみです。
      例外:
      SocketException - 使用しているプロトコルでエラー(TCPエラーなど)が発生した場合。
      導入されたバージョン:
      1.4
      関連項目:
    • setLoopbackMode

      @Deprecated(since="14") public void setLoopbackMode(boolean disable) throws SocketException
      非推奨。
      かわりに、DatagramSocket.setOption(SocketOption, Object)StandardSocketOptions.IP_MULTICAST_LOOPとともに使用してください。 ループバック・モードはデフォルトで有効になっており、MulticastSocket.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false)によって無効化されます。
      マルチキャスト・データグラムのローカル・ループバックを無効化/有効化します。 このオプションは、マルチキャスト・データをローカル・ソケットにループバックするかどうかを設定するためのヒントとして、プラットフォーム・ネットワーク・コードによって使用されます。

      このオプションはヒントなので、アプリケーションでループバック・モードの設定を調べる必要がある場合は、getLoopbackMode()を呼び出してください。

      パラメータ:
      disable−LoopbackModeを無効にする場合はtrue
      例外:
      SocketException−値の設定中にエラーが発生した場合
      導入されたバージョン:
      1.4
      関連項目:
    • getLoopbackMode

      @Deprecated(since="14") public boolean getLoopbackMode() throws SocketException
      非推奨。
      かわりに、DatagramSocket.getOption(SocketOption)StandardSocketOptions.IP_MULTICAST_LOOPとともに使用してください。
      マルチキャスト・データグラムのローカル・ループバックの設定値を取得します。
      戻り値:
      LoopbackModeが無効になった場合はtrue
      例外:
      SocketException−値の取得中にエラーが発生した場合
      導入されたバージョン:
      1.4
      関連項目:
    • send

      @Deprecated public void send(DatagramPacket p, byte ttl) throws IOException
      非推奨。
      かわりに、次のコードまたは同等のコードを使用します:
        ......
        int ttl = mcastSocket.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
        mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, newttl);
        mcastSocket.send(p);
        mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl);
        ......
      ソケットのデフォルト以外のTTL (time-to-live)を使用してデータグラム・パケットを宛先に送信します。 このメソッドを使用する必要があるのは、特定のTTLが必要とされる場合だけです。それ以外の場合は、このソケット上でTTLを一度だけ設定し、そのデフォルトのTTLをすべてのパケットで使用することをお薦めします。 このメソッドは、ソケットのデフォルトのTTLを変更しません その動作は、setInterfaceの影響を受ける可能性があります。

      セキュリティ・マネージャが存在する場合、このメソッドはまず、いくつかのセキュリティ・チェックを実行します。 最初に、p.getAddress().isMulticastAddress()がtrueの場合、このメソッドは引数としてp.getAddress()ttlを使い、セキュリティ・マネージャのcheckMulticastメソッドを呼び出します。 その式の評価がfalseの場合、このメソッドは代わりに、セキュリティ・マネージャのcheckConnectメソッドを、引数p.getAddress().getHostAddress()p.getPort()を指定して呼び出します。 それぞれのセキュリティ・マネージャ・メソッド呼出しの結果、操作が許可されない場合はSecurityExceptionがスローされます。

      パラメータ:
      p−送信されるパケット。 パケットには、宛先のマルチキャストIPアドレスと送信対象のデータを含めるべきである。 ある宛先マルチキャスト・アドレスにパケットを送信するには、そのグループのメンバーである必要はない。
      ttl−マルチキャスト・パケットの有効期間(オプション)。デフォルトttl値は1。
      例外:
      IOException−エラーが発生した場合、具体的にはttlの設定中にエラーが発生した場合に発行されます。
      SecurityException - セキュリティ・マネージャが存在し、そのcheckMulticastまたはcheckConnectメソッドが送信を許可しない場合。
      PortUnreachableException - 現在到達不可能になっている宛先にソケットが接続されている場合にスローされる可能性があります。 例外が必ずスローされるとは限らないことに注意。
      IllegalArgumentException - ソケットが接続されていて、接続アドレスとパケット・アドレスが異なる場合、ソケットが接続されておらず、パケット・アドレスが設定されていない場合、またはポートが範囲外の場合。
      関連項目: