0

我编写了一个简单的计算两个数字之和的示例 RMI 应用程序。

我的 server.policy 看起来像:

grant {
permission java.net.SocketPermission "123.4.567.890:1024-", "accept, resolve";
};

我的 client.policy 看起来像:

grant codeBase "file:/C:/Users/user/Documents/My_Workspace/Project/RMI/-" {
permission java.net.SocketPermission "123.4.567.890:1024-", "connect, resolve";
};

我阅读了有关策略文件语法的文档,并了解到当您在端口号后加上破折号时,它表示“此端口号及更大”。我对端口了解不多,但是,如果我将破折号从 server.policy 中删除,我会得到java.security.AccessControlException随机端口号(似乎在 50,000 到 65,000 之间),但是,如果我将破折号从 client.policy 中删除,我会得到与端口号 1099相同java.security.AccessControlException,每次都是罪魁祸首。

我想知道是否有一种方法可以避免将破折号放在我的策略文件中以使我的 RMI 应用程序正常工作。

此外,如果它有帮助或很重要,我将分别在我的createRegistry()getRegistry()服务器/客户端的方法中指定端口 1099。

4

1 回答 1

0

有。如果:

  1. 您可以通过 LocateRegistry.createRegistry() 从服务器 JVM 中启动注册表
  2. 您从同一个 JVM 构造或导出所有远程对象,指定端口 1099 或端口 0,或者根本不指定端口号,并且
  3. (1) 或 (2) 中都没有套接字工厂,或者套接字工厂都有 equals() 方法的合理实现

所有远程对象将共享同一个端口,即端口 1099。

但为什么 .policy 文件中的破折号如此重要?

于 2014-03-04T23:04:15.713 回答