/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package trabalho3; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; //import java.io.EOFException; //import java.io.IOException; //import java.io.ObjectInputStream; //import java.net.UnknownHostException; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import java.util.Scanner; public class processoSender { static DatagramPacket msg; static InetAddress grupo; static MulticastSocket s; private static Scanner keyboard; static int contadorMensagens = 0; static String groupIP = "224.0.0.1"; static int multicastPort = 2000; static int IDProcesso = 0; /* // Leitura de teclado static String lerGrupo = "1"; static String enviarMensagem = "2"; static String verificarCoordenador = "3"; */ static String mensagem = ""; static final String DESCONECTAR = "q"; static final String ELEICAO = "e"; static final String VERIFICA_COORDENADOR = "v"; static final String DIVISOR_STRING = ";"; static final String menu = "1-Ler grupo\n" + "2-Enviar mensagem\n" + "3-Verificar Coordenador\n" + "q-Encerrar processo"; public static void sendMessage(String msgStr) { msg=new DatagramPacket(msgStr.getBytes(), msgStr.length(),grupo, 2000); System.out.println("Enviando mensagem para o grupo ..."); try { s.send(msg); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* public static void receiveMessage(int i) { byte[] buf=new byte[1000]; DatagramPacket recv=new DatagramPacket(buf, buf.length); System.err.print("Aguardando mensagem "+i+" ..."); try { s.receive(recv); byte[] dest=new byte[recv.getLength()]; System.arraycopy(recv.getData(), 0, dest, 0, dest.length); System.err.println("Mensagen recebida: "+ new String(recv.getData(),recv.getOffset(),recv.getLength())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } */ /* public static void sendObj() { try { //Prepare Data String message = "Hello there!"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos; oos = new ObjectOutputStream(baos); oos.writeObject(message); byte[] data = baos.toByteArray(); //Send data s.send(new DatagramPacket(data, data.length, grupo, multicastPort)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } */ //Funcao de configuracao public static void setUp() { try { System.setProperty("java.net.preferIPv4Stack", "true"); // somente pra mac no wifi grupo=InetAddress.getByName(groupIP); s=new MulticastSocket(multicastPort); System.err.println("Entrando no grupo ..."); s.joinGroup(grupo); System.err.println("Ok."); // s.setLoopbackMode(true); //evita de ler a propria mensagem } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void defineIDProcesso(){ keyboard = new Scanner(System.in); System.out.println("Informe o ID deste processo: "); IDProcesso = keyboard.nextInt(); } public static boolean verificaCoordenador(){ //envia mensagem para coordenador, se nao receber resposta dentro do timeout faz eleicao //Se receber resposta do coordenador //return true; //se falhar return false; } /* public static int opcoesTeclado(){ keyboard = new Scanner(System.in); System.out.println(menu); mensagem = keyboard.nextLine(); if(mensagem.equals(lerGrupo)){ contadorMensagens++; receiveMessage(contadorMensagens); }else if(mensagem.equals(enviarMensagem)){ //sendObj(); keyboard = new Scanner(System.in); System.out.println("Mensagem a ser enviada: "); mensagem = keyboard.nextLine(); sendMessage(mensagem); }else if(mensagem.equals(verificarCoordenador)){ //System.out.println("Opcao 3 selecionada"); if(verificaCoordenador()){ //Achou coordenador }else{ //Nao achou coordenador, faz eleicao } }else if(mensagem.equalsIgnoreCase(sair)){ break; } } */ public static String recebeMensagem(){ byte[] buf=new byte[1000]; DatagramPacket recv=new DatagramPacket(buf, buf.length); try { s.receive(recv); byte[] dest=new byte[recv.getLength()]; System.arraycopy(recv.getData(), 0, dest, 0, dest.length); String mensagemRecebida = new String(recv.getData(),recv.getOffset(),recv.getLength()); System.err.println("Mensagen recebida: "+ mensagemRecebida); return mensagemRecebida; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return ""; } } public static int trataMensagem(String mensagemRecebida){ String[] partes = mensagemRecebida.split(DIVISOR_STRING); String operacao = partes[0]; String mensagem = partes[1]; if(operacao.equals(VERIFICA_COORDENADOR)){ return 1; }else if(operacao.equals(ELEICAO)){ return 2; }else if(operacao.equals(DESCONECTAR)){ if(Integer.parseInt(mensagem) == IDProcesso){ return 3; } else return 0; }else if(operacao.equals("")){ return -1; }else{ // mensagem ignorada return 0; } } public static void main(String[] args) { try { setUp(); defineIDProcesso(); //sendMessage("Novo membro no grupo"); while(true) { switch(trataMensagem(recebeMensagem())){ case 1: //Verificar Coordenador break; case 2: //Realizar eleicao break; case 0: // System.err.print("mensagem ignorada"); break; case -1: System.err.print("Mensagem nao recebida"); break; case 3: System.err.println("Processo "+IDProcesso+" saindo do grupo..."); s.leaveGroup(grupo); System.err.println("Desconectado do grupo."); default: System.err.print("Case default"); break; } } } catch(Exception exc) { exc.printStackTrace(); } } }