Java RMI - 在不同的机器上访问RMI注册表对象 - AccessControlException?

时间:2011-11-08 15:12:04

标签: java rmi

我正试图让一台机器上的客户端通过Java RMI与另一台机器上的服务器通信。我在端口Y的主机IP X上部署服务器。然后我尝试让客户端在服务器上查找远程对象,我得到以下异常:

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission <IP address>:<port> connect,resolve)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
    at java.net.Socket.connect(Socket.java:524)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at nursestation.NurseStation.subscribeToPatients(NurseStation.java:65)
    at nursestation.NurseStation.<init>(NurseStation.java:42)
    at nursestation.perf.SimplePerfTest.main(SimplePerfTest.java:28)

请注意,客户端和服务器都在运行时,策略文件允许所有权限。 RMI注册表也在服务器上运行。关于为什么我得到这个例外的任何想法?我该怎么做才能让客户端与运行在不同服务器上的服务器通信?

更新

政策文件

grant {
  permission java.security.AllPermission;
};

客户端启动 - 使用Eclipse的RMI插件

  1. 启动RMI注册表
  2. 使用上面显示的java.security.policy的指定策略文件和指向我的项目工作区代码的java.rmi.server.codebase执行“java BedsideMonitorMain patient1 vital1 vital2”
  3. patient1对象绑定到RMI注册表
  4. 服务器启动

    1. 使用上面显示的java.security.policy的指定策略文件和指向我的项目工作区代码的java.rmi.server.codebase执行“java NurseStationMain patient1”

1 个答案:

答案 0 :(得分:0)

所以我找出了潜在的问题。显然这两台机器都有一个不同的Eclipse RMI插件许可证密钥,它不允许两台机器相互通信。当我在两台机器上制作相同的许可证密钥时,我就能让客户端和服务器相互通信。出于我的目的,这已经足够了,因为我没有在生产环境中使用这个系统(它是一个类项目)。我很好奇,但这个问题的“最佳”解决方案是什么。