目次へ

解答例 - 実習課題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();
    }

}

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp