Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / MulticastReceiver.java
@motoki miura motoki miura on 19 Aug 2 KB d
package info.istlab.ServerTester;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.util.Hashtable;

import javax.swing.JOptionPane;

public class MulticastReceiver implements Runnable{
    Thread thread;
    MulticastSocket socket;
    MulticastSender sender;
    RemoteHostsWindow remoteHostsWindow;

    // 受信したデータを IP アドレスをキーにして保存
    Hashtable<String, String> receivedData = new Hashtable<String, String>();

    public MulticastReceiver(int portNum) {
        try {
            socket = new MulticastSocket(portNum);
            InetAddress group = InetAddress.getByName("224.0.0.1");
            socket.joinGroup(group);
        } catch (IOException e) {
            e.printStackTrace();
        }
        thread = new Thread(this);
        thread.start();
        sender = new MulticastSender(portNum);
        remoteHostsWindow = new RemoteHostsWindow(receivedData);
    }

    public void run(){
        while(thread != null){
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            try {
                socket.receive(packet);
            } catch(SocketException sx) {
                thread = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
            String addr = packet.getAddress().getHostAddress();
            String message = new String(packet.getData(), 0, packet.getLength());

            receivedData.put(addr, message);
            if (remoteHostsWindow != null) {
                remoteHostsWindow.updateData(addr, message);
                remoteHostsWindow.frame.pack();
            }
            // System.out.println(addr+"からの受信: " + message);
        }
    }
    public void stop(){
        socket.close();
        sender.stop();
        // thread = null;
    }

    public void openWindow() {
        if (receivedData.size() == 0) {
            JOptionPane.showMessageDialog(Host.mainhost, "受信したデータがありません。", "受信データなし", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (remoteHostsWindow != null) {
            remoteHostsWindow.setVisible(true);
        } else {
            remoteHostsWindow = new RemoteHostsWindow(receivedData);
        }
    }
}