かなりの調査と試行錯誤の末、セキュリティ マネージャが必要かどうか、必要な場合はどうすれば機能するかをまだ判断できません。
サーバーを起動するコード:
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;
};
助けてくれる人に感謝します。
確かに、Security Manager が必要かどうかも定かではありませんが、使用していないときは以下のようになりました。少なくともここでサーバーが起動し、クライアントからサーバーに接続できました (提供された IP アドレスは接続を取得するために使用されませんでした。これは内部で把握されました)。ただし、サーバー側で時間を表示するだけのはずの「printTime」だけでも、サーバーのメソッドの1つを使用しようとすると、次のエラーメッセージが表示されます。
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: ...IP...; nested exception is:
java.net.ConnectException: Connection timed out: connect
再度、感謝します。
編集:
OK、セキュリティ マネージャーを削除しました。必要なクラスはすべて、クライアント プロジェクトとサーバー プロジェクトの両方に含まれるインターフェイス内にあるためです。@EJP、Java と RMI に関しては、あなたは明らかに非常に知識が豊富です。私はあなたのコメントを大切にしています。
Connection timed out エラーが引き続き発生します。これはよくあることだと思いますが、考えられることはすべて試しました。
プロパティを追加しました: java.rmi.server.codebase を lib フォルダー内のすべての jar ファイルに追加しました。
ある友人から、RMI が送信するには複雑すぎる POJO (Plain Old Java Objects) を含めたことが問題だと指摘されました。しかし、私の POJO はすべてシリアライズ可能です。また、ローカルホストでサーバーを実行し、クライアント アプリを使用して問題なくアクセスできました。これは、RMI が私が求めている作業を実行できることを示しています。
リモート マシンでサーバーを実行してクライアントを起動するまで、この接続エラーは発生しません。クライアントは接続できますが、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
(他の多くの行の中で)
これは実際に聞いているということですか?