2016-05-19 6 views
0

単純なRMIアプリケーションを作成しましたが、リモートオブジェクトをRMIレジストリにバインドできません。 RMIレジストリは、別のcmdウィンドウ[Windows 10を使用しています]から実行されています。 リモートインターフェースは非常に簡単です:リモートオブジェクトをRMIレジストリにバインドしようとしたときに

​​

実装も簡単です:私はそれを実行すると

package matram; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.rmi.Naming; 

public class RemoteDCmain { 

    public static Test1 dc; 

    public static void main(String[] args) throws InterruptedException { 
     if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } 

     try { 
      String name = "DCregistry"; 
      dc = new Test1(); 
      Naming.rebind(name, dc); 
      print("dc bound"); 
     } 
     catch (java.rmi.RemoteException ex) { 
      print("Remote Exception"); 
      ex.printStackTrace();; 
     } 
     catch (Exception e) { 
      print("Naming.rebind exception:"); 
      e.printStackTrace(); 
     } 

     try { 
      final InetAddress localaddr = InetAddress.getLocalHost(); 
      print("Local IP Address : " + localaddr); 
     } catch (UnknownHostException e) { 
      print("Can't detect localhost : " + e); 
     } 

     init(); 

    } // main 

    private static void init() { 
     try { 
     // (new Thread((Runnable) dc)).start(); 
      Thread.sleep(1200); 
     } catch (Exception e) { 
      print(String.format("Could not connect to account W")); 
      e.printStackTrace(); 
     } 
    } // init() 

    public static void print(Object o) { 
     System.out.println("DC server: " + o); 
    } 
} 

[:

package matram; 

import java.rmi.RemoteException; 

public class Test1 extends java.rmi.server.UnicastRemoteObject implements RemoteInterface { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public Test1() throws RemoteException { 
     super(); 
    } 

    @Override 
    public String sayHello() throws RemoteException { 
     { return "Hello world!"; } 
    } 
} 

ここではmainメソッドが含まれているサーバは、ですEclipse内から]

DC server: Naming.rebind exception:java.lang.IllegalArgumentException 

    at sun.net.www.ParseUtil.decode(Unknown Source) 
    at sun.net.www.protocol.file.Handler.openConnection(Unknown Source) 
    at sun.net.www.protocol.file.Handler.openConnection(Unknown Source) 
    at java.net.URL.openConnection(Unknown Source) 
    at sun.rmi.server.LoaderHandler.addPermissionsForURLs(Unknown Source) 
    at sun.rmi.server.LoaderHandler.getLoaderAccessControlContext(Unknown Source) 
    at sun.rmi.server.LoaderHandler.lookupLoader(Unknown Source) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source) 
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source) 
    at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source) 
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source) 
    at java.io.ObjectInputStream.readProxyDesc(Unknown Source) 
    at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 
    at sun.rmi.transport.Transport$1.run(Unknown Source) 
    at sun.rmi.transport.Transport$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) 
    at sun.rmi.server.UnicastRef.invoke(Unknown Source) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Unknown Source) 
    at matram.RemoteDCmain.main(RemoteDCmain.java:16) 

私は本当にこれがどこから来ているのか失われています。そして、私はまだクライアントを呼び出すことさえしていません...

+0

あなたはリモートレジストリを宣言しませんでした:LocateRegistry.createRegistry(Registry.REGISTRY_PORT); – Supahupe

+0

@Supahupeはい、彼はそれをしました。レジストリは実行中です。レジストリは例外を投げた。スタックトレースを参照してください。実行していなければ、この例外ではなく、 'ConnectException'を取得するでしょう。 – EJP

答えて

1
at sun.net.www.protocol.file.Handler.openConnection(Unknown Source) 

あなたはどこかfile: URLを使用しています。

at sun.rmi.server.LoaderHandler.lookupLoader(Unknown Source) 

クラスローダーを使用しています。

結論:java.rmi.serve.codebaseシステムプロパティで無効なfile: URLを指定しています。

URLがfile:である理由は何ですか?クライアントが同じホスト上にない限り、クライアントには使用されません。この場合、実際にはコードベース機能はまったく必要ありません。

+0

おそらく、問題は私のファイルURLにスペースがあることです:rmiregistry -J-Djava.rmi.server.codebase = file: "/// C:/ Users/Shahar/Box %% 20Sync/git/MATraM/target/classes/matram/"(これは.classファイルのディレクトリです) - スペースを置き換えるより適切な方法はありますか? – Shahar

+0

'%20'はHTTP URLに対しては正しいですが、' %% 20'はどのURLに対しても正しくありません。それがタイプミスで、あなたが本当に '%20'を持っていたとすれば、私はリテラルスペースを試してみるでしょう。 – EJP

+0

**%20 ** java.rmi.ServerExceptionが発生しました:サーバースレッドでRemoteExceptionが発生しました。ネストされた例外は次のとおりです。java.rmi.UnmarshalException:引数をアンマーシャリングしていません。ネストされた例外は次のとおりです。** java.lang.ClassNotFoundException **:matram.RemoteInterface **リテラルスペース**はjava.rmiを提供します。ServerException:サーバースレッドでRemoteExceptionが発生しました。ネストされた例外は次のとおりです。java.rmi.UnmarshalException:引数をアンマーシャリングしていません。 ** java.net.MalformedURLException:プロトコルがありません**:Sync/git/MATraM/target/classes/matram/ – Shahar

-1

Javaで統合されたコンポーネントのより良い実践を覚えておくべきことの1つは、CMDの使用です。私は日食の使用についてあなたを落胆させていませんが、RMIは別のケースです。 Java RMIでは、コマンドrmiregistry 4545を使用して明示的に空きポート(4545など)でRMIレジストリを開始する必要があります。javacではなくrmicでサーバークラスをコンパイルする必要があります。最後に一つだけ; rmiサーバーアドレスに完全修飾URLを使用します。例:rmic://localhost:4545/myServer

+1

これは正しくありません。 rmi-serviceは、jvm => LocateRegistry.createRegistry(4545)から開始できます。 –

+0

そして、 'javac'でサーバをコンパイルする必要があります。その後、「rmic」プロセスが始まり、13年間はオプションとなりました。サーバー*がコンパイルされているだけでなく、実行中でも、自分自身のスタブを提供できるようになっていることに気づきませんでした。そして、これのどれもOPの問題とは関係がありません。 – EJP

関連する問題