Chat JAVA-RMI

4 respostas
E

Estou tentando implementar no codigo do chat, para um cliente se comunicar direto com outro cliente sem passar pelo servidor.

Ja tentei de tudo... alguem poderia me ajudar, estou usando java-rmi.

Obrigado

Segue o codigo abaixo.
public class SocketTextUI {
    
    
    /**
     * Please see that this works poorly...
     * Just to show how distribution works...
     * It breaks some OO patterns too.
     */
    public static void main( String args[] ) {
        Scanner scanner = new Scanner( System.in );
        
        System.out.print( "Enter 0 to start a server and 1 for client:" );
        int type = scanner.nextInt();
        if ( type == 0 ) {
            
            System.out.print( "Please type the port to be used:" );
            int port = scanner.nextInt();
            
            ChatServer server = new ChatServer( port );
            System.out.println( "Waiting client..." );
            
        } else {
            
            System.out.print( "Please type the server's IP: " );
            String ip = scanner.next();
            System.out.print( "Please type the server's port: " );
            int port = scanner.nextInt();
            
            ChatClient client = new ChatClient( ip ,port );
            
        }
    }   
}
public class RMITextUI {
    
    /**
     * Please see that this works poorly...
     * Just to show how distribution works...
     * It breaks some OO patterns too.
     */
    public static void main( String args[] ) {
        Scanner scanner = new Scanner( System.in );
        
        System.out.print( "Enter 0 to start a server and 1 for client:" );
        int type = scanner.nextInt();
        if ( type == 0 ) {
            try {
                RMIChatServerIT server = new RMIChatServer();
                Naming.rebind( RMIChatServer.HOST_ADD, server);
                System.out.println( "Waiting client..." );
            } catch (Exception e) {
                System.err.println("RMIChatServer exception: " + e.getMessage());
                e.printStackTrace();
            }
            
        } else {
            
            try {
                Scanner teclado = new Scanner( System.in );
                System.out.print( "Tell me your NICK please: " );
                String myNick = scanner.next();
                RMIChatClientIT client = new RMIChatClient( myNick );
                
                RMIChatServerIT server = ( RMIChatServerIT ) Naming.lookup( RMIChatServer.HOST_ADD );
                server.connect( client );
                String linha = ""; //TODO: should change!
                while ( !linha.equals( "xau" ) ) {
                    linha = teclado.next();
                    server.sendMessage( new Message( myNick, linha ) );
                }
                server.disconnect( client );
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NotBoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }   
}

4 Respostas

I

É mandatório que seja utilizado RMI e que não haja intermediação do Server? Senão iria te sugerir de usar servlets na parte servidora e os clientes comunicarem-se via URL com os servlets. Veja que não é necessário páginas html/jsppara isso! Pode ser uma aplicação desktop normal.

Se não for possível desta forma, além de haver um server para gerenciar a comunicação entre os clientes RMI, cada cliente também deve ser um server (ser capaz de servir) para poder fazer com que dois clientes comuniquem-se independentemente. Ou seja, o teu server gerencia a comunicação inicialmente, depois de eleito o cliente que será o server e os dois comunicam-se diretamente. O server gerente sai fora da comunicação e o cliente/client-server estão por conta. Era o que eu buscaria. T+

G

[color=“red”][size=“9”]* Movido para: Segurança / Redes[/size][/color]

E

Entendi o q vc quiz dizer…

O meu problema eh q os clientes tem q se comunicarem normal pelo server. Tenho q colocar uma opcao para quando quiser mandar uma mensagem privada entre duas pessoas as outras nao vejam essa mensagem. Ela so apareca na tela do outro usuario e nao para todos.

I

Ok, então isso é mais uma funcinalidade do protocolo do teu chat. Quando um cliente manda uma mensagem em private, o server sabe que é private certo (se não sabe faça-o saber!)? Então o server sabendo que aquela mensagem é direcionada, não faça broadcast dela, passe-a para o cliente ao qual ela pertence somente.

Segunda alternativa é abrir um novo canal RMI (client/server) direto entro as partes. Isto com certeza tráz um pouco mais de confiabilidade/confidencialidade de que o conteúdo não será capturado no server. Mas como diz o ditado: “caiu na ‘rede’ é peixe!”

T+

Criado 12 de dezembro de 2006
Ultima resposta 14 de dez. de 2006
Respostas 4
Participantes 3