/*
* 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
0 B
|👍
/👎