解答例 - 実習課題1 - 5.IPマルチキャスト
(実習課題1)
マルチキャストを利用して、次の機能を満たすチャットアプリケーションを作成して下さい。使用するマルチキャストアドレスは固定で構いません。
- swingを利用したウィンドウアプリケーション。表示するコンポーネントは次の通り。
- 受信したメッセージを表示するテキストエリア。メッセージ受信時には、送信者のIPアドレスとメッセージを表示する。
- 送信するメッセージを入力するテキストエリア。
- 入力したメッセージを送信する「send」ボタン。
- マルチキャストグループへ参加する「join」ボタン。
- マルチキャストグループから脱退する「leave」ボタン。
- アプリケーション起動時には、マルチキャストグループには参加していないこと。「join」ボタンを押すことによってマルチキャストグループに参加するようにする。グループに参加・グループから脱退するときは、自分を含む全参加者にチャットメッセージでその旨を通知すること。
- 3台以上のホストが参加できること。
解答例
/** * MulticastSample.java TECHSCORE Javaネットワークプログラミング5章 実習課題 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.net.chapter5; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.DatagramPacket; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class MulticastChat extends JFrame implements ActionListener { public static final int MCAST_PORT = 10013; public static final int PACKET_SIZE = 1024; public static final String MCAST_ADDRESS = "224.0.1.1"; public static final String ENCODING = "Shift-JIS"; private JButton sendButton; private JButton joinButton; private JButton leaveButton; private JTextField sendTextField; private JTextArea receiveTextArea; private InetAddress mcastAddress; private MulticastSocket socket = null; public MulticastChat() { super("MulticastChat"); setDefaultCloseOperation(EXIT_ON_CLOSE); Container container = getContentPane(); receiveTextArea = new JTextArea(10, 30); receiveTextArea.setEditable(false); receiveTextArea.setLineWrap(false); container.add(new JScrollPane(receiveTextArea), BorderLayout.CENTER); Box inputBox = Box.createVerticalBox(); container.add(inputBox, BorderLayout.SOUTH); sendTextField = new JTextField(30); inputBox.add(sendTextField); JPanel buttonPanel = new JPanel(); inputBox.add(buttonPanel); sendButton = new JButton("送信"); sendButton.addActionListener(this); buttonPanel.add(sendButton, BorderLayout.WEST); joinButton = new JButton("参加"); joinButton.addActionListener(this); buttonPanel.add(joinButton, BorderLayout.CENTER); leaveButton = new JButton("脱退"); leaveButton.addActionListener(this); buttonPanel.add(leaveButton, BorderLayout.EAST); sendButton.setEnabled(false); leaveButton.setEnabled(false); pack(); } public void start() { try { //マルチキャストソケットを作成 socket = new MulticastSocket(MCAST_PORT); mcastAddress = InetAddress.getByName(MCAST_ADDRESS); System.out.println("MulticastChatが起動しました : (port=" + socket.getLocalPort() + ")"); byte buf[] = new byte[PACKET_SIZE]; DatagramPacket receivePacket = new DatagramPacket(buf, buf.length); while (true) { socket.receive(receivePacket); //受信データグラムパケットの内容 String receiveMessage = new String(buf, 0, receivePacket.getLength(), ENCODING); //受信したデータをテキストエリアに表示 receiveTextArea.append(receivePacket.getAddress() + ": " + receiveMessage + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) { socket.close(); } } } public void actionPerformed(ActionEvent event) { DatagramPacket sendPacket; //送信ボタン if (event.getSource().equals(sendButton)) { try { String sendMessage; sendMessage = sendTextField.getText(); byte[] buf = sendMessage.getBytes(ENCODING); sendPacket = new DatagramPacket(buf, buf.length, mcastAddress, MCAST_PORT); socket.send(sendPacket); sendTextField.setText(""); } catch (IOException e) { e.printStackTrace(); } } //グループ参加ボタン if (event.getSource().equals(joinButton)) { try { socket.joinGroup(mcastAddress); String joinMessage = "グループに参加しました"; byte[] buf = joinMessage.getBytes(ENCODING); sendPacket = new DatagramPacket(buf, buf.length, mcastAddress, MCAST_PORT); socket.send(sendPacket); sendButton.setEnabled(true); leaveButton.setEnabled(true); joinButton.setEnabled(false); } catch (IOException e) { e.printStackTrace(); } } //グループ脱退ボタン if (event.getSource().equals(leaveButton)) { try { String leaveMessage = "グループを脱退しました"; byte[] buf = leaveMessage.getBytes(ENCODING); sendPacket = new DatagramPacket(buf, buf.length, mcastAddress, MCAST_PORT); socket.send(sendPacket); socket.leaveGroup(mcastAddress); sendButton.setEnabled(false); leaveButton.setEnabled(false); joinButton.setEnabled(true); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String args[]) { MulticastChat frame = new MulticastChat(); frame.setVisible(true); frame.start(); } }