単純な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)
私は本当にこれがどこから来ているのか失われています。そして、私はまだクライアントを呼び出すことさえしていません...
あなたはリモートレジストリを宣言しませんでした:LocateRegistry.createRegistry(Registry.REGISTRY_PORT); – Supahupe
@Supahupeはい、彼はそれをしました。レジストリは実行中です。レジストリは例外を投げた。スタックトレースを参照してください。実行していなければ、この例外ではなく、 'ConnectException'を取得するでしょう。 – EJP