Problemas com RMI

Ola pessoal, estou tentando criar um simples sistema RMI mais estou com algums problemas, o cliente não consegue conectar com o servidor, segue os codigos, agradeço desde já

classe vez

package rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class vez extends UnicastRemoteObject implements vezInterface{
	
	
   int jogador = 1;
	
	
	public vez() throws RemoteException {
		}

	public int getJogador() throws RemoteException {
		return jogador;
	}

	public void setJogador(int jogador) throws RemoteException  {
		this.jogador = jogador;
	}
}[/code]

interface vezInterface
[code]package rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface vezInterface extends Remote {
	

	public int getJogador() throws RemoteException;
	public void setJogador(int jogador) throws RemoteException;

}

Servidor

[code]package rmi;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {

/**
 * @param args
 */
public static void main(String[] args) throws Exception {
	

	
	vez vez = new vez();
	
	Registry r = LocateRegistry.createRegistry(1099);
	r.rebind("vez", vez);
	
	//System.out.print(LocateRegistry.getRegistry());
	System.out.println(vez.getJogador());
	System.out.println("Aguardando requisições...");
}

}
[/code]

na parte do cliente tenho o seguinte:

vezInterface

[code]package Principal;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface vezInterface extends Remote {

public int getJogador() throws RemoteException;
public void setJogador(int jogador) throws RemoteException;

}
[/code]

Cliente

package Principal;

import java.awt.EventQueue;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.rmi.Naming;

import javax.swing.JOptionPane;

public class start {


	public static void main(String[] args) throws Exception{
		
		vezInterface vez = (vezInterface)Naming.lookup("rmi://localhost:1099/vez");
		System.out.println(vez.getJogador());

}
}

O servidor tem o seguinte arquivo de segurança server.policy

[code]grant { permission java.security.AllPermissions; permission java.net.SocketPermission"*", “connect, resolve”;

};[/code]

O servidor executa sem problemas, porem quando executo o cliente recebo o seguinte erro:

Daemon System Thread [RMI TCP Connection(idle)] (Suspended (exception AccessControlException))
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: not available
ThreadPoolExecutor$Worker.run() line: not available
Thread.run() line: not available

java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.io.EOFException at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) at sun.rmi.server.UnicastRef.invoke(Unknown Source) at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) at java.rmi.Naming.lookup(Unknown Source) ...

Alguem pode ajudar por favor. Obrigado

Na linha 19 na sua Classe Servidor… tente colocar:

     r.rebind("rmi://localhost:1099/vez", vez);  

invés disso…

     r.rebind("vez", vez);  

e no Cliente linha 15…

     vezInterface vez = (vezInterface)Naming.lookup("rmi://localhost/vez"); 

invés disso…

     vezInterface vez = (vezInterface)Naming.lookup("rmi://localhost:1099/vez"); 

Vê se funciona!

Abraço.

fiz as mudanças porem ainda estou com o mesmo erro, na janela de debug mostra o seguinte:

[code]Server (1) [Java Application]
rmi.Server at localhost:49429
Thread [DestroyJavaVM] (Running)
Daemon System Thread [RMI TCP Connection(idle)] (Suspended (exception AccessControlException))
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: not available
ThreadPoolExecutor$Worker.run() line: not available
Thread.run() line: not available
C:\Program Files\Java\jre7\bin\javaw.exe (03/04/2012 12:19:39)
start [Java Application]
Principal.start at localhost:49434
<terminated, exit value: 0>C:\Program Files\Java\jre7\bin\javaw.exe (03/04/2012 12:19:43)

[/code]

[code]package rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class Server {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) throws Exception {  
          
      
          
        new Server();
          
    }  
    
    public Server() {
    	 vezInterface vez = null;
		try {
			vez = new vez();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
         
         try {
			Naming.rebind("rmi://localhost:1099/vez", vez);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}

}[/code]

package principal;  
  
import java.rmi.Naming;
  
public class start {  
  
  
    public static void main(String[] args) throws Exception{  
          
        vezInterface vez = (vezInterface)Naming.lookup("rmi://localhost:1099/vez");  
        System.out.println(vez.getJogador());  
    }
  
}  

Até eu comi mosca. Tenta agora!
Libere a porta 1099 no firewall…

liberei a porta no firewall e tentei fazer essas mudanças a mudança no servidor ja da erro logo que roda o programa:

Server (1) [Java Application] rmi.Server at localhost:49582 Thread [main] (Suspended (exception AccessControlException)) RegistryImpl_Stub.rebind(String, Remote) line: not available Naming.rebind(String, Remote) line: not available Server.<init>() line: 34 Server.main(String[]) line: 19 C:\Program Files\Java\jre7\bin\javaw.exe (03/04/2012 20:27:43)

Cara me desculpa… faltou uma coisinha uma linha no server…

import java.net.MalformedURLException;  
import java.rmi.Naming;  
import java.rmi.RemoteException;  
        
        
    public class Server {    
        
        /**  
         * @param args  
         */    
        public static void main(String[] args) throws Exception {    
                                
            new Server();  
                
        }    
          
        public Server() {  
             vezInterface vez = null;  
            try {
				vez = new vez();
			} catch (RemoteException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}    
               
             try {  
            	 java.rmi.registry.LocateRegistry.createRegistry(1099); 
                Naming.rebind("rmi://localhost:1099/vez", vez);  
            } catch (RemoteException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } catch (MalformedURLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
          } 
}

Faltou isso: java.rmi.registry.LocateRegistry.createRegistry(1099); para a VM registrar a porta né!? Que burro EU!

Tenta ai agora.

não sei mais o que fazer, fiz tudo que voce disse, porem quando rodo o server.java o eclipse ja entra em debug mode e mostra:

Server (1) [Java Application] rmi.Server at localhost:50510 Thread [main] (Suspended (exception AccessControlException)) RegistryImpl_Stub.rebind(String, Remote) line: not available Naming.rebind(String, Remote) line: not available Server.<init>() line: 35 Server.main(String[]) line: 19 C:\Program Files\Java\jre7\bin\javaw.exe (08/04/2012 20:11:18)

Olha… comigo não falha.
Porém eu uso Java 6.
AccessControlException me parece ser exceção de segurança do Java… eu sei que se pode configurar permissões… ainda mais que você está fazendo acesso rmi.
Mas no Java nunca precisei configurar a VM… como você está usando Java 7 talvez a Oracle mudou algo na diretiva de segurança.
Eu não sei fazer essas configurações… Mas na pior das hipóteses volte para o Java 6… o 7 é cheio de picuinhas.

vou baixar o java6 pra testar, tomara que volte com alguns resultados positivos, valeu pela força

java.lang.UnsupportedClassVersionError: rmi/Server : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source)

:cry:

Remova o JAVA 7 SDK e JRE do seu PC…
Remova do seu ClassPath e associe sua IDE com o JAVA6
Dê um Rebuild no seu projeto e pronto.

Esse erro acontece, porque você tá rodando Classe compilada no Java7 (version 51) com ClassLoader do Java6 (version 49).
Tenta ai de novo.

bom consegui compliar a classe do servidor agora, porem quando tento fazer o acesso do cliente ao servidor o seguinte erro esta acontecendo:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: rmi.vezInterface (no security manager: RMI class loader disabled) at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) at java.rmi.Naming.lookup(Unknown Source)

poxa RMI eh cheio dos frufru :S

mexi no servidor e no cliente adicionando o seguinte codigo antes de fazer as chamadas do RMI :

[code] if(System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());

	}[/code]

e tambem adicionei os seguintes arquivos de policy

cliente:

[code] grant { permission java.security.AllPermissions; permission java.net.SocketPermission"*", “connect, resolve”;

};[/code]

servidor:

grant { permission java.security.AllPermission "", ""; };

Agora recebo o seguinte erro quando rodo o cliente

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: rmi.vezInterface at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) at java.rmi.Naming.lookup(Unknown Source)

PS. Ja quero agradecer novamente pela sua ajuda!!

aeeeeeeeeeee consegui fazer os dois funcionarem, tive que colocar a interface do lado do cliente dentro de um pacote igualzinho como estava dentro do servidor. Valeu pela ajuda.