5. IP マルチキャスト

UDP 通信では, マルチキャストを利用して同時に複数の相手にデータを送信することができる.

5.1 マルチキャスト

UDP におけるデータの送信方式には3つの方法がある:

1. ユニキャスト (unicast)
2. ブロードキャスト (broadcast)
3. マルチキャスト (multicast), (224.0.0.1 ~ 239.255.255.255)

注意:

通常マルチキャストパケットはルータを通過することができない.

5.2 MulticastSocket クラス

MulticastSocket クラスはマルチキャスト通信を行うためのソケットを表すクラス.

MulticastSocket クラスは DatagramSocket クラスのサブクラスであり, DatagramSocket にマルチキャスト通信のための機能がいくつか追加されている.

DatagramSocket より追加された重要なメソッドは, マルチキャストグループに参加, 脱退するためのメソッド:

1. public void joinGroup(InetAddress mcastaddr);
2. public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf);
3. public void leaveGroup(InetAddress mcastaddr);
4. public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf);

これら以外に追加されたメソッドには TTL (Time To Live) 値を取り扱うメソッドがある. ソケットから送信されるパケットの TTL 値を設定, 取得する:

1. public int getTimeToLive();
2. public void setTimeToLive(int ttl);

注意:

MulticastSocket クラスのデフォルトの TTL 値は 1 となる. つまり, デフォルトでは, マルチキャストパケットはルータによって区切られたネットワーク内のみに転送される.

5.3 マルチキャスト送受信プログラム

マルチキャストでデータを通信するプログラムを作成してみよう.

一方向に文字列を送信するプログラムを作成することにする.

まず, 送信側のプログラムを示す

MulticastSender.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.DatagramPacket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class MulticastSender{
    public static final int ECHO_PORT = 51015;
    public static final int PACKET_SIZE = 1024;
    public static final String MCAST_ADDRESS = "224.0.1.1";

    public static void main(String[] args){
	MulticastSocket socket = null;

	try{
	    InetAddress mcastAddress = InetAddress.getByName(MCAST_ADDRESS);
	    BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));
	    socket = new MulticastSocket();

	    String message;

	    while( (message = keyIn.readLine()).length() > 0 ){
		byte[] bytes = message.getBytes();

		DatagramPacket packet = new DatagramPacket(bytes, bytes.length, mcastAddress, ECHO_PORT);
		socket.send(packet);
	    }
	}catch(IOException e){
	    e.printStackTrace();
	}finally{
	    if(socket != null){
		socket.close();
	    }
	}
    }
}

注意:

マルチキャスト通信でも, 送信側はマルチキャストグループに参加する必要がない.
ここでは, マルチキャストアドレスとしての [224.0.1.1] を使用している. 基本的に
クラス D アドレスならなんでも構わないが, [224.0.0.0 ~ 224.0.0.255] は 特定
用途のために予約されているので, その範囲のアドレスは使用しないほうがよいだろう.

次に受信側のプログラムを示す.

MulticastReceiver.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.net.MulticastSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.io.IOException;

public class MulticastReceiver{
    public static final int ECHO_PORT = 51015;
    public static final int PACKET_SIZE = 1024;
    public static final String MCAST_ADDRESS = "224.0.1.1";

    public static void main(String[] args){
	MulticastSocket socket = null;
	byte[] buf = new byte[PACKET_SIZE];
	DatagramPacket packet = new DatagramPacket(buf, buf.length);

	try{
	    socket = new MulticastSocket(ECHO_PORT);
	    InetAddress mcastAddress = InetAddress.getByName(MCAST_ADDRESS);
	    socket.joinGroup(mcastAddress);
	    
	    System.out.println("MulticastReceiverを起動した("
			       + "address=" + mcastAddress
			       + ",port=" + socket.getLocalPort() + ")");

	    while(true){
		socket.receive(packet);
		String message = new String(buf, 0, packet.getLength());
		System.out.println(packet.getSocketAddress() + " : " + message);
	    }
	}catch(IOException e){
	    e.printStackTrace();
	}finally{
	    if(socket != null){
		socket.close();
	    }
	}
    }
}

注意:

受信側では, マルチキャストパケットを受信するために, マルチキャストグループに
参加する必要がある.
送信側のプログラムと通信するためには, 送信側で指定したマルチキャストアドレス
と同じアドレスを指定する.

上記のプログラムの実行結果 (MulticastSender.java):

[wtopia Multicast]$ java MulticastSender
m1
m2
m3
m4
(空行)

上記のプログラムの実行結果 (MulticastReceiver.java):

[wtopia]$ java MulticastReceiver
MulticastReceiverを起動した(address=/224.0.1.1,port=51015)
/10.0.12.129:65362 : m1
/10.0.12.129:65362 : m2
/10.0.12.129:65362 : m3
/10.0.12.129:65362 : m4

5.4 マルチキャストを利用し, チャットアプリケーションを作成しよう