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();
}
}