マルチキャスト Javaプログラミング1 Java編

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