经过大量搜索和反复试验后,我仍然无法确定是否需要安全管理器,如果需要,如何使其正常工作。
启动服务器的代码:
Registry registry;
try {
System.setProperty("java.security.policyfile", "\\\\...\\security.policy");
if (System.getSecurityManager() == null) {
RMISecurityManager securityManager = new RMISecurityManager();
System.setSecurityManager(securityManager);
}
registry = LocateRegistry.createRegistry(port);
registry.bind(serviceName, remote);
System.out.println("RMI registry created.");
} catch (RemoteException e) {
//error means registry already exists
System.out.println("RMI registry already exists.");
}
System.setProperty("java.rmi.server.hostname", hostURL);
Naming.rebind(hostURL, remote);
服务器上的错误消息:
D:\>java -jar Server.jar
RMI server starting up
RMI registry created.
Exception in thread "main" ...Exception: Unable to start the Remote Server Server[UnicastServerRef [liveRef: [...]]
at ServiceProvider.start(ServiceProvider.java:64)
at Server.main(Server.java:76)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.hostname" "write")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.System.setProperty(Unknown Source)
at ServiceProvider.start(ServiceProvider.java:61)
... 1 more
政策文件:
grant {
permission java.security.AllPermission;
};
感谢任何能提供帮助的人。
我承认我甚至不确定我是否需要安全管理器,但是当我不使用它时,我得到了以下内容。至少在这里服务器启动了,我能够从客户端连接到它(提供的IP地址不用于获取连接,这是在内部计算出来的)。但是,当我尝试使用服务器中的一种方法时,我收到以下错误消息,甚至只是“printTime”,它应该只显示服务器端的时间。
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: ...IP...; nested exception is:
java.net.ConnectException: Connection timed out: connect
再次感谢。
修改
好的,我已经删除了安全管理器,因为所需的所有类都在我的界面中,包含在我的客户端和服务器项目中。 @EJP,你明显知识渊博的Java和RMI。我重视你的意见。
我继续收到连接超时错误。我意识到这很常见,但我已经尝试了所有我能想到的东西 我添加了属性:java.rmi.server.codebase,包含我的lib文件夹中的所有jar文件。
一位朋友告诉我,我的问题是我已经包含了POJO(普通的旧Java对象),它们太复杂了,无法传输RMI。但我的所有POJO都是可序列化的。此外,我能够在我的localhost上运行服务器并使用客户端应用程序访问它而没有问题。这告诉我RMI可以完成我要求的工作。
在远程计算机上运行服务器然后启动客户端之前,我没有收到此Connection错误。我的客户端能够连接,但后来挂起了printTime方法。
运行客户端的代码:
final Registry registry = LocateRegistry.getRegistry(hostURL, port);
final HXTTDBFInterface serverIX = (HXTTDBFInterface) registry.lookup(serviceName);
//Start with simple Server Connection Test
serverIX.printTime(); //CONNECTION TIMED OUT ERROR HERE
String time = serverIX.getTime();
System.out.println("Time From Server: " + time);
如果有人对事情有任何建议,我会全力以赴。 提前谢谢。
进一步澄清: 我使用命令netstat -a并显示:
LocalAddress ForeignAddress State
0.0.0.0:1099 SERVERNAME:0 LISTENING
[::]:1099 SERVERNAME:0 LISTENING
XX.XX.XX.XX:53373 SERVERNAME:1099 ESTABLISHED
(在许多其他行中)
这是否意味着它实际上正在倾听?
答案 0 :(得分:4)
如果对等方使用代码库工具动态地为您提供类,则只需为RMI安装安全管理器。否则,无论您是否使用,都严格取决于您。我会避免它,除非你知道它是必需的。