UDPのマルチキャストプログラムです。
これはマルチキャスト用の特別なIPアドレス
(Dクラス:上位4ビットが1110)を使って
MulticastSocketクラスのオブジェクトをグループに参加させることで、
そのグループに参加している全てのホストで同じ受信ができます。
各ホストはいつでもマルチキャストグループへの参加と脱退が可能です。
マルチキャストグループに、ホスト位置やホスト台数の制限がありません。
なお、自身が属していないマルチキャストグループに対する送信も可能です。
標準的なIPルータ(仕様的にはIPマルチキャストルータが存在する)で、
他のネットワークへの転送も可能です。
(その場合、当然に他のネットワークへ流せるIPパケットの生存時間は、1より大きくする必要があります。
:1の時は、他のネットワークへ流れません。)
なお、マルチキャストルータには、
マルチキャスト経路制御プロトコル【Multicast Routing Protocol】と呼ばれる
経路制御用のプロトコルが導入されています。
以下に送信のマルチキャストプログラムを示します。
以下では、このマルチキャスト用のグループ参加用IPアドレスとして 239.192.0.0を使っています。
MulticastSocketクラスはDatagramSocketクラスのサブクラスになっており、使用するデータの入れ物クラスは、DatagramPacketでUDP通信と同じです。
送信側では、必ずしもホストグループに参加する必要はありません。
また送信側ではパケットの生存時間を設定することで、パケットが余計に外部へ流れない指定をしています。(リスト09行 他のネットワークへ流せるIPパケットの生存時間は、1より大きくする必要があります。ルータを経由するごとに、これが減らされて0なら外部に流さない規則になっています。)
01
02
03
04
05
06
07
08
09
10 11
12
13
14
15
16
17
18
19
20 21
22
23
import java.net.*;//DatagramSocket、MulticastSocket 、InetAddress用 import java.io.*; public class MultSndTest { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); InetAddress inet = InetAddress.getByName(239.192.0.0); int portNumber = 49153;//ポート番号 MulticastSocket sendSocket = new MulticastSocket();//マルチキャスト送信用 sendSocket.setTimeToLive(1);//寿命設定:1回のルー越えで消滅(外部に流さない)★ System.out.print("送信文字列>"); String msg = br.readLine();//送信メッセージキー入力 msg = "ここはsから始まる学籍番号に変更" + msg; byte[] buf = msg.getBytes("MS932");//バイト列に変換 DatagramPacket packet; packet = new DatagramPacket(buf, buf.length, inet, portNumber); //IPアドレス、ポート番号も指定 sendSocket.send(packet);//送信 sendSocket.close();//ソケットを閉じる } }
以下に送受信のマルチキャストプログラムを示します。 以下では、このマルチキャスト用のグループ参加用IPアドレスとし239.192.0.0を使っています。 受信プログラムでの大きな違いはjoinGroup(inet)によるホストグループへの参加機能です。
01
02
03
04
05
06
07
08
09
10 11
12
13
14
15
16
17
18
19
20
import java.net.*;//DatagramSocket用 public class MultRecTest { public static void main(String[] args) throws Exception { byte[] buf = new byte[256]; int portNumber = 49153;//ポート番号 InetAddress inet = InetAddress.getByName("239.192.0.0");//★ MulticastSocket recSocket = new MulticastSocket(portNumber);//受信用ソケット recSocket.joinGroup(inet); //指定のマルチキャストアドレスのグループに参加★ DatagramPacket packet = new DatagramPacket(buf, buf.length); System.out.println("受信待機状態"); recSocket.receive(packet);//受信& wait int len = packet.getLength();//受信バイト数取得 String msg = new String(buf, 0, len,"MS932");//受信バイト列のデコード System.out.print(packet.getAddress() + "より受信\n 『"); System.out.println(msg + "』:以上" + len + "byte を受信しました。"); recSocket.close(); } }