/* MulticastDataGet.java
 * copyright Koji Wada 2005
 */

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 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;
import java.util.Locale;
import java.io.IOException;
import java.util.*;
import java.awt.Component;

public class MulticastDataGet implements Runnable {
  public static final int MCAST_PORT = 10011;
  public static final int PACKET_SIZE = 1024;
  public static final String MCAST_ADDRESS = "224.0.1.1";
  public static final String ENCODING = "EUCJIS"; 
  private JButton sendButton;
  private JButton joinButton;
  private JButton leaveButton;
  private JTextField sendTextField;
  private JTextArea receiveTextArea;
  private InetAddress mcastAddress;
  private MulticastSocket socket = null;
  public static String data[] = new String[8];
  public String joinedMessage = "";
  static int checkcounter = 0;

  public MulticastDataGet() {
    ;
  }

  public void run() {
    String ip = "";
    data[2] = "0";
    data[3] = "0";
    try {
      InetAddress host = InetAddress.getLocalHost();
      byte[] addr = host.getAddress();
      for ( int i = 0; i < addr.length; i++ ) {
        int ub = addr[i] < 0 ? addr[i] + 256 : addr[i];
        ip += ip.equals( "" ) ? "" : ".";
        ip += Integer.toString( ub );
      }
      try {
        //マルチキャスト・ソケットを作成
        socket = new MulticastSocket(MCAST_PORT);
        mcastAddress = InetAddress.getByName(MCAST_ADDRESS);
        System.out.println("MulticastDataGet started. (IP=" + MCAST_ADDRESS + " Port=" + socket.getLocalPort() + ")");
      } catch (IOException e) {
        e.printStackTrace();
      }
      DatagramPacket sendPacket;
      // 参加開始
      try {
        socket.joinGroup(mcastAddress);
        //String joinMessage = "グループに参加しました";
        String joinMessage = ip + " " + "JOIN";
		joinedMessage = ip + " " + "JOIN";
        byte[] buf = joinMessage.getBytes(ENCODING);
        sendPacket = new DatagramPacket(buf, buf.length, mcastAddress, MCAST_PORT);
        socket.send(sendPacket);
      } catch (IOException e) {
        e.printStackTrace();
      }
	  //
	  Timer timer2 = new Timer(true);
	  CheckTask task2 = new CheckTask();
	  timer2.schedule(task2, 0, 1000);

      // 受信開始
      byte buf[] = new byte[PACKET_SIZE];
      while (true) {
        DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
        socket.receive(receivePacket);
        //受信データグラム・パケットの内容
        String receiveMessage = new String(buf, 0, receivePacket.getLength(), ENCODING);
        //受信したデータを表示
		//System.out.println("(" + receiveMessage + ")");
		if (receiveMessage.equals(joinedMessage)) {
		  MulticastClientTR72W.joinflag = 1;
		}
        StringTokenizer st = new StringTokenizer(receiveMessage, " ");
        int i, j;
        j = st.countTokens();
        for (i=0; i < j; i++) {
          data[i] = st.nextToken();
          //  if (i == 2) {System.out.print(data[i] + " ");}
          //  if (i == 3) {System.out.println(data[i]);}
        }
		if (data[1].equals("DATA")) {
		  checkcounter = 0;
		  MulticastClientTR72W.joinflag = 1; // 復旧したら表示を続ける
		}

      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (socket != null) {
        socket.close();
      }
    }
  }

  public static String oneData() {
	String r;
	r = data[2] + " " +  data[3];
	return r;
  }

  // データ到来確認用タイマ
  public static class CheckTask extends TimerTask {
    CheckTask() {
      ;
    }
    public void run() {
      if(checkcounter++ > 10) {
        checkcounter = 0;
		MulticastClientTR72W.joinflag = 0;
      }
    }
  }
}

//EOF
