2

サーバーとクライアントが同じマシン上にある単純な RMI サービスを実行しようとしています。残念ながら、サーバー クラスを実行しようとするたびに、例外が発生します。サーバーとクライアントを別々のフォルダーに保管し、必要なファイルをクライアントにコピーしました。

これらは私が取ったステップです:

  1. サーバーファイルを保持するフォルダをCLASSPATHに追加します。
  2. rmir​​egistry を開始します。(私が知る限り、スタブファイルをスタブファイルで更新する必要はもうありません
  3. サーバーを実行します。<- 例外
  4. クライアントを実行します。

フォルダ階層:

サーバー [AddServerIntf.class、AddServerImpl.class、AddServer.class] クライアント [AddServerIntf.class、AddClient.class]

例外

C:\Users\Szymon\Desktop\serwer>java AddServer
Exception: java.rmi.ServerException: RemoteException occurred in server thread;
nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: AddServerIntf

コード

リモートインターフェース

import java.rmi.*;

public interface AddServerIntf extends Remote {
   double add(double d1, double d2) throws RemoteException;
}

上記のインターフェースを実装するクラス

import java.rmi.*;
import java.rmi.server.*;

public class AddServerImpl extends UnicastRemoteObject
   implements AddServerIntf {

   public AddServerImpl() throws RemoteException {
   }
   public double add(double d1, double d2) throws RemoteException {
      return d1 + d2;
   }
}

サーバーを作成するクラス

import java.net.*;
import java.rmi.*;

public class AddServer {
   public static void main(String args[]) {

      try {
         AddServerImpl addServerImpl = new AddServerImpl();
         Naming.rebind("AddServer", addServerImpl);
      }
      catch(Exception e) {
         System.out.println("Exception: " + e);
      }
   }
}

クライアント

import java.rmi.*;

public class AddClient {
   public static void main(String args[]) {
      try {
          String addServerURL = "rmi://" + args[0] + "/AddServer";
          AddServerIntf addServerIntf = (AddServerIntf)Naming.lookup(addServerURL);
         System.out.println("1st: " + args[1]);
         double d1 = Double.valueOf(args[1]).doubleValue();
         System.out.println("2nd: " + args[2]);

         double d2 = Double.valueOf(args[2]).doubleValue();
         System.out.println("Sum: " + addServerIntf.add(d1, d2));
      }
      catch(Exception e) {
         System.out.println("Exception: " + e);
      }
   }
}

スタブファイルの効果は同様です

C:\Users\Szymon\Desktop\serwer>java AddServer
Exception: java.rmi.ServerException: RemoteException occurred in server thread;
nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: AddServerImpl_Stub 
4

1 に答える 1