ネットワークプログラミング 5章 IPマルチキャスト
- 5.1. マルチキャスト
- 5.2. MulticastSocketクラス
- 5.3. マルチキャスト送受信プログラム
5.3. マルチキャスト送受信プログラム
それでは、マルチキャストでデータを通信するプログラムを作成してみましょう。前節と同じく、一方向に文字列を送信するプログラムを作成することにします。
まず、送信側のプログラムを示します。
リスト MulticastSender.java
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 = 10007; 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(); } } } }
送信側のプログラムでは、ほとんどマルチキャスト固有の処理はしていません。ソケットをMulticastSocketにし、パケットの送信先アドレスをマルチキャストアドレスにしているだけです。マルチキャスト通信でも、送信側はマルチキャストグループに参加する必要はありません。
なお、ここではマルチキャストアドレスとして224.0.1.1を使用しています。基本的にクラスDアドレスなら何でも構いませんが、224.0.0.0〜224.0.0.255は特定用途のために予約されていますので、その範囲のアドレスは使用しない方がよいでしょう。
次に受信側のプログラムを示します。
リスト MulticastReceiver.java
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 = 10007; 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(); } } } }
受信側では、マルチキャストパケットを受信するために、マルチキャストグループに参加する必要があります。19〜21行目で、ソケットの作成およびマルチキャストグループへの参加を行っています。送信側のプログラムと通信するためには、送信側で指定したマルチキャストアドレスと同じアドレスを指定します。
socket = new MulticastSocket(ECHO_PORT); InetAddress mcastAddress = InetAddress.getByName(MCAST_ADDRESS); socket.joinGroup(mcastAddress);
(実習課題)
マルチキャストを利用して、次の機能を満たすチャットアプリケーションを作成して下さい。使用するマルチキャストアドレスは固定で構いません。
- swingを利用したウィンドウアプリケーション。表示するコンポーネントは次の通り。
- 受信したメッセージを表示するテキストエリア。メッセージ受信時には、送信者のIPアドレスとメッセージを表示する。
- 送信するメッセージを入力するテキストエリア。
- 入力したメッセージを送信する「send」ボタン。
- マルチキャストグループへ参加する「join」ボタン。
- マルチキャストグループから脱退する「leave」ボタン。
- アプリケーション起動時には、マルチキャストグループには参加していないこと。「join」ボタンを押すことによってマルチキャストグループに参加するようにする。グループに参加・グループから脱退するときは、自分を含む全参加者にチャットメッセージでその旨を通知すること。
- 3台以上のホストが参加できること。