Bressam icon

Distribuidos - TDE 3 base

Bressam | PRO | 05/17/18 04:01:49 AM UTC | 0 ⭐ | 380 👁️ | Never ⏰ | []
Java |

7.58 KB

|

None

|

0 👍

/

0 👎

/*
 * 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();
        }
    }
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎