UDP 通信では, マルチキャストを利用して同時に複数の相手にデータを送信することができる.
UDP におけるデータの送信方式には3つの方法がある:
1. ユニキャスト (unicast)
2. ブロードキャスト (broadcast)
3. マルチキャスト (multicast), (224.0.0.1 ~ 239.255.255.255)
注意:
通常マルチキャストパケットはルータを通過することができない.
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 となる. つまり, デフォルトでは, マルチキャストパケットはルータによって区切られたネットワーク内のみに転送される.
マルチキャストでデータを通信するプログラムを作成してみよう.
一方向に文字列を送信するプログラムを作成することにする.
まず, 送信側のプログラムを示す
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