Pessoal eu tenho um método aqui que imprime o valor correto da votação na mesma classe Servidor, só pq quero imprimir o resultado no cliente so pq chamo o msm metodo so que nao funciona, ja fiz de tudo aqui e ele nao imprime no Cliente.
esse é o metodo.
` @Override
public void calcularParcial(){
System.out.println("\nurna@localhost$> Parcial: ");
this.votos.keySet().stream().forEach((candidato) -> {
System.out.println(String.format("Candidato %s "
+ "recebeu %s votos", candidato.getNome(), this.votos.get(candidato)));
});
}`
na classe cliente chamo ele assim this.urna.calcularParcial();
ele nao mim retorna nada.
` this.urna.votar(numero);
System.out.println("Voto computado!");
this.urna.calcularParcial();`
alguem tem alguma ideia?
Posta o código completo do cliente e do servidor.
Como está fazendo a comunicação do código cliente com o código do servidor?
1 curtida
amigo vou postar a classe que pediu aqui certo?
mais é o seguinte, quando chamo o metodo para imprimir no cliente ele imprime é no servidor, apaguei a opcao de imprimir no servidor ai ele nao imprime, mais se eu chamar o metodo no cliente, so de ele imprimir no propio cliente, ele imprime é no servidor. Dar para entender?
classe servidor
`public class Servidor implements Runnable {
private Urna urna;
@Override
public void run() {
try {
this.urna = this.prepararUrna();
LocateRegistry.createRegistry(1099);
Naming.rebind("rmi:///Urna", this.urna);
System.out.println("urna@localhost$> Urna iniciada, pronta para receber votos!");
} catch (RemoteException | MalformedURLException ex) {
System.err.println(ex);
System.exit(1);
}
}
private Urna prepararUrna() throws RemoteException {
final String candidatos = "João:10,Maria:20,Jean:30,Alex:40,Rubens:50";
final Urna urnaVazia = new Urna();
final String comando = candidatos;
if (comando != null && !comando.isEmpty()) {
final String[] arrayCandidatos = comando.split(",");
for (String dadosCandidato : arrayCandidatos) {
final String nome = dadosCandidato.split(":")[0];
final String numero = dadosCandidato.split(":")[1];
urnaVazia.adicionaCandidato(new Candidato(nome,
Integer.parseInt(numero)));
}
}
this.mostrarCandidatos(urnaVazia);
return urnaVazia;
}
private void mostrarCandidatos(Urna urna) throws RemoteException {
System.out.println("urna@localhost$> Candidatos disponiveis para votação:");
final Set<Candidato> candidatos = urna.getCandidatos();
candidatos.stream().forEach((candidato) -> {
System.out.println(String.format("-> Nome %s, número %s",
candidato.getNome(), candidato.getNumero()));
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Servidor());
}
}
`
classe cliente
`package votacaormi;
import java.awt.EventQueue;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.util.Scanner;
import java.util.Set;
public class Cliente implements Runnable {
private IUrna urna;
private String ipCliente = “127.0.0.1”;
@Override
public void run() {
try {
LocateRegistry.getRegistry(1099);
System.out.println("conectado ao servidor");
urna = (IUrna) Naming.lookup("rmi://localhost/Urna");
urna.PegarIP(ipCliente);
} catch (Exception ex) {
System.err.println(ex);
System.exit(1);
}
this.capturarVotos();
}
public void capturarVotos() {
boolean exit = false;
try {
final Scanner teclado = new Scanner(System.in);
System.out.println("############SISTEMA DE VOTAÇÃO############");
System.out.println("## Escolha um candidato e em seguida ##");
System.out.println("## digite o numero correspondente a ele ##");
System.out.println("## para contabilizar 1 voto ##");
while (!exit) {
System.out.println("\n## Candidatos ##");
this.mostrarCandidatos();
System.out.println("################");
System.out.print("cliente@"+ipCliente+"$> ");
String voto = Console.readCommand(teclado);
Integer numero = Integer.parseInt(voto);
while (numero != 10 && numero != 20 && numero != 30 && numero != 40 && numero != 50) {
System.err.println("Voto Inválido,informe um número correto!");
numero = teclado.nextInt();
}
try {
if (urna.PegarIP(this.ipCliente)) {
System.err.println("Eleitor ultrapassou limite de votação");
this.urna.calcularParcial();//metodo que calcular o parcial
break;
}else{
this.urna.votar(numero);
System.out.println("Voto computado!");
this.urna.calcularParcial();//metodo que calcular o parcial
}
} catch (NumberFormatException ex) {
System.err.println("cliente@localhost$> formato de voto invalido!");
}
}
} catch (Exception ex) {
System.err.println(ex);
}
}
private void mostrarCandidatos() throws Exception {
final Set<Candidato> candidatos = this.urna.getCandidatos();
candidatos.stream().forEach((candidato) -> {
System.out.println(String.format("-> Nome %s, número %s",
candidato.getNome(), candidato.getNumero()));
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Cliente());
}
}
`
Alberto_junior:
quando chamo o metodo para imprimir no cliente ele imprime é no servidor, apaguei a opcao de imprimir no servidor ai ele nao imprime, mais se eu chamar o metodo no cliente, so de ele imprimir no propio cliente, ele imprime é no servidor.
Bom, você está usando objetos distribuídos (no caso com o protocolo RMI)
O código mostrarCandidatos
está implementado no servidor, ele faz println
das suas informações, esses println
evidentemente serão impressos no servidor, que é justamente onde seu código está executando.
Se você quer imprimir essas informações no cliente, então você precisa serializar as informações para seu cliente (pode fazer seu método retornar uma lista com os objetos, ao invés de ser void
) e implementar esses println
no cliente também.
1 curtida