2

かなりの調査と試行錯誤の末、セキュリティ マネージャが必要かどうか、必要な場合はどうすれば機能するかをまだ判断できません。

サーバーを起動するコード:

    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

(他の多くの行の中で)

これは実際に聞いているということですか?

4

1 に答える 1