2013-10-11 80 views
1

我正在为Netbeans中的类分配创建RMI程序。这是一个简单的RMI程序,服务器端正常工作。但是,当我运行我的客户端文件。它结束了给我错误RMI程序:客户端发出错误

Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve") 

加上它说在客户端代码26行的一些错误。为了清楚理解,我给出了所有三个文件的完整代码。

Interface.java:

package RMI; 

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

public interface DemoInterface extends Remote { 

    public String SayDemo() throws RemoteException; 

} 

Server.java

package RMI; 

import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 

public class Server implements Interface{ 
    public Server() 
    { 
     super(); 
    } 
    private String message; 
    public Server(String msg) throws RemoteException 
    { 
     message = msg; 
} 


public static void main(String[] args) { 
    try { 
     DemoInterface h = new Server("Hello"); 
     DemoInterface stub = (DemoInterface) UnicastRemoteObject.exportObject(h,0); 
     LocateRegistry.createRegistry(4096); 
     Registry registry = LocateRegistry.getRegistry("127.0.0.1",4096); 

     registry.rebind("Hello", stub); 

     System.out.println("Server is connected and ready to use"); 
    } 
    catch(Exception e) 
    { 
     System.out.println("server not connected\n"+e); 
    } 
} 
    @Override 
public String SayDemo() throws RemoteException { 
    System.out.println("Server.saydemo override"); 
    return message; 
} 
} 

Client.java

package RMI; 

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

public class Client { 
public static void main(String[] args) { 
    if(System.getSecurityManager() == null) 
    { 
     System.setSecurityManager(new SecurityManager()); 
    } 
    try { 

     Registry reg = LocateRegistry.getRegistry("127.0.0.1", 4096); 
     System.out.println("in try after reg locate"); 
     DemoInterface h = (DemoInterface) reg.lookup("Hello");//Error Showed on this line by netbeans 
     System.out.println(h.SayDemo()); 
    } 
    catch(RemoteException | NotBoundException e) 
    { 
     System.out.println(""+e); 
    } 
} 
} 

请顾找到我错在哪里。先谢谢你。

+1

因为你说的服务器运行的是这可能不是问题,但端口1099是基本上在每个操作系统中保留。尝试4096或更高。另外,请,请为您的界面提供一个比'Interface'更好的名称。 –

+0

编辑根据您对端口号:4096和Interface = DemoInterface的建议仍然收到相同的错误@musical_coder – NAPSTER

回答

2

您在客户main方法中设置了SecurityManager。你是否也提供了一个安全策略文件?默认策略不是非常宽容,并且拒绝套接字操作等。

您可以指定一个允许对所有代码库的所有权限的策略,如下所示。

grant { 
    permission java.security.AllPermission; 
}; 

将它添加到您的命令行中以调用java。替代mypolicy作为您的政策文件,SomeApp替代您的主类。 注意第二个参数中两个=字符

java -Djava.security.manager -Djava.security.policy==mypolicy SomeApp 

请注意,这不是RMI在生产环境中运行安全策略(RMI可以加载远程代码库)。

正确使用SecurityManager类和策略配置的是一个复杂的主题,进一步阅读,我建议Java SE 7 Security Documentation,特别Default Policy Implementation and Policy File Syntax

+0

感谢您通过“SecurityManager”了解安全特权。得到你的观点后,我评论这些行,现在我的程序运行成功......谢谢Dev和@musical_coder – NAPSTER

+0

@NAPSTER:很高兴你得到它的工作。由于Dev的答案似乎是解决了你的问题,请点击勾号以接受它。 –

+0

@NAPSTER只记得,这个设置为RMI服务提供了对客户端的无限制访问,只是你知道;) – MadProgrammer