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); } } }