Ir ao conteúdo
  • Cadastre-se

Java Chat RMI com Callback


Posts recomendados

Olá
Estou com um problema num programa que realiza um chat com um RMI com Callback
Tanto o servidor e o cliente não compilam e eu já tentei de tudo para resolver isso.

Segue em anexo o código do servidor, do cliente e das interfaces junto com o erro que dá na hora da compilação.

Código do servidor

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.util.Scanner;

public class Server extends UnicastRemoteObject implements IIncrementa{

        public String text;
        Scanner ler;
        public Server() throws RemoteException{
                ler = new Scanner(System.in);
        }
        public static void main (String args[]){
        try{
                LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
                Server obj_server = new Server();
                Naming.rebind("rmi://127.0.0.1/Incrementa", obj_server);
        }catch(Exception e){
                System.out.println("Erro no servidor"+e);
        }
 }
        public void inc (IClient obj_Client, String msg) throws RemoteException{
                System.out.println("Mensagem vinda do cliente: "+msg);
                System.out.println("Digite uma mensagem: ");
                text = ler.nextLine();
                obj_client.callClient(text);
        }
}

Código do cliente

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.Scanner;

public class Client extends UnicastRemoteObject implements IClient{
        String text;

        public Client(String host) throws RemoteException{
                try{
                IIncrementa obj = (IIncrtementa) Naming.lookup("rmi://"+host+"/Incrementa");
                while(true){
                System.out.println("Digite uma mensagem: ");
                text = ler.nextLine();
                obj.inc(this, text);
                }
        }catch(Exception e){
                System.out.println("ERRO NO CONSTRUTOR!!!!!"+e);
                }
        public void callClient(String msg_cli) throws RemoteException{
                System.out.println("Mensagem do server: "+msg_cli);
        }
        public static void main (String args[]){
                try{
                Client obj_cli = new Client(args[0]);
                }catch(Exception e){
                        System.out.println("Erro no cliente"+e);
                }
        }
        }
}

Código da interface 1

import java.rmi.*;

public interface IIncrementa extends Remote{

        public String chat (String msg) throws RemoteException; //método que será acessado pelo cliente, somente declaração!

}

Código da interface 2

import java.rmi.*;
interface IClient extends Remote{
        public void callClient (String msg_cli) throws RemoteException;
}

Os erros que dão na hora de compilar:

Do Cliente:

image.png.849e79f7ef91cad14a5c5703e64859c5.png

 

Do Servidor:

image.thumb.png.a3f74f8d8cdfd732b0b9706c30aa6c9a.png

Link para o comentário
Compartilhar em outros sites

A classe Client está com problema nas chaves. Verifique onde você abre e onde você fecha cada uma delas.

 

Dica: Procure dar mais atenção à organização do seu código. Um código bonito e organizado facilita a leitura e ajuda a prevenir esses tipos de problema.

 

 

A classe Server está tentando acessar um objeto que não existe. Além disso, a classe implementa uma interface, mas não está implementando os métodos dessa interface.

 

Quando uma interface é implementada, todos os métodos abstratos dela devem ser implementados na classe concreta.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
Em 29/06/2022 às 17:36, AdrianoSiqueira disse:

A classe Client está com problema nas chaves. Verifique onde você abre e onde você fecha cada uma delas.

 

Dica: Procure dar mais atenção à organização do seu código. Um código bonito e organizado facilita a leitura e ajuda a prevenir esses tipos de problema.

 

 

A classe Server está tentando acessar um objeto que não existe. Além disso, a classe implementa uma interface, mas não está implementando os métodos dessa interface.

 

Quando uma interface é implementada, todos os métodos abstratos dela devem ser implementados na classe concreta.

Olá desculpe a demora

Ajeitei um pouco o Client, o Server e as interfaces como mostra abaixo.

O Server:

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.util.Scanner;

public class Server extends UnicastRemoteObject implements IIncrementa{

        public String text;
        Scanner ler;

        public Server() throws RemoteException{
                ler = new Scanner(System.in);
        }
        public static void main (String args[]){

        try{
                LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
                Server obj_server = new Server();
                Naming.rebind("rmi://127.0.0.1/Incrementa", obj_server);
        }catch(Exception e){
                System.out.println("Erro no server"+e);
        }
        }
        //public void inc (IClient Obj_client, String msg) throws RemoteException{
        public String chat (String msg) throws RemoteException{
                System.out.println("Mensagem do Cliente: "+msg);
                System.out.println("Digite uma Mensagem: ");
                text = ler.nextLine();
                return text;
        }
}

O Client:

import java.rmi.*;
import java.rmi.server.*;
import java.util.Scanner;

public class Client extends UnicastRemoteObject implements IClient{
//public class Client{
        String text;

        public Client(String host) throws RemoteException{
                try{
                IIncrementa obj = (IIncrementa) Naming.lookup("rmi://"+host+"/Incrementa");
                        Scanner ler = new Scanner(System.in);
                        //obj.chat2(this);
                        while(true){
                        System.out.println("Digite uma mensagem: ");
                        text = ler.nextLine();
                        //obj.inc(this, texto);
                        //obj.chat2(this);
                        }
                }catch(Exception e){
                        System.out.println("Erro no construtor"+e);
                }
        }
        public void callClient(String msg_cli) throws RemoteException{
                System.out.println("Mensagem do Server: "+msg_cli);
        }
        public static void main (String args[]){
                try{
                Client obj_cli = new Client(args[0]);
                }catch(Exception e){
                        System.out.println("Erro no cliente"+e);
                }
                }
}

Interface 1:

import java.rmi.*;

public interface IIncrementa extends Remote{

        public String chat (String msg, String chat2) throws RemoteException; //método que será acessado pelo cliente, somente declaração!

}

Interface 2:

import java.rmi.*;
interface IClient extends Remote{
        public void callClient (String msg_cli) throws RemoteException;
}

Então na minha visão o Client já está com o callback incluso, gostaria de saber como eu posso colocar o callback no Server.

Link para o comentário
Compartilhar em outros sites

Basta criá-lo com a mesma assinatura da interface.

 

Por exemplo, se na interface está assim:

void chat(String x);

 

Na classe Server deve estar assim:

public void chat(String x) {
}

 

Se na interface está assim:

void chat(String a, String b);

 

Na classe Server deve estar assim:

public void chat(String a, String b) {
}

 

O tipo de retorno, o nome do método e o tipo dos parâmetros devem coincidir com o que foi declarado na interface. Já o nome dos parâmetros não importa, podendo ser qualquer coisa, respeitando o padrão de nomenclatura do Java.

Link para o comentário
Compartilhar em outros sites

3 horas atrás, AdrianoSiqueira disse:

Basta criá-lo com a mesma assinatura da interface.

 

Por exemplo, se na interface está assim:

void chat(String x);

 

Na classe Server deve estar assim:

public void chat(String x) {
}

 

Se na interface está assim:

void chat(String a, String b);

 

Na classe Server deve estar assim:

public void chat(String a, String b) {
}

 

O tipo de retorno, o nome do método e o tipo dos parâmetros devem coincidir com o que foi declarado na interface. Já o nome dos parâmetros não importa, podendo ser qualquer coisa, respeitando o padrão de nomenclatura do Java.

Então seria assim?

 public String chat (String msg, String chat2) throws RemoteException{

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!