私は数時間 RMI の問題に苦しんでいます。これは、同じコンピューターでクライアントとサーバーの両方を起動した場合にのみ機能する、今のところかなりばかげた例です。!= マシンでクライアント ^ サーバーを起動するとすぐに、サーバーがコールバックを呼び出そうとすると例外が発生します。
Exception creating connection to: 192.168.244.1; nested exception is:
java.net.SocketException: Network is unreachable
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:632)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128)
ちなみに、私は 10.0.0.x サブネット上にいるので意味がありません。この IP はどこから来たのですか?
このコードは、サーバーとクライアントの 2 つのクラスで構成され、2 つの {Server|Client} インターフェイスを実装しています。RMIRegistry からサーバー オブジェクトを取得し、ログイン メソッドを呼び出すことに問題はありません。サーバー側のブレークポイントでコードが実行されていることがわかりますが、コールバック命令になるとすぐに失敗します。例外はクライアント側です。
両方のマシンでファイアウォールを無効にしようとしましたが、成功しませんでした。問題は、例外が送信した IP にあると思われますが、どこから来たのかわかりません。
次のコードは次のとおりです: (Client.java)
public class Client extends UnicastRemoteObject implements ClientInterface {
public static void main(String[] args) {
try {
new Client();
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
public Client() throws RemoteException, MalformedURLException, NotBoundException {
ServerInterface s = null;
s = (ServerInterface) Naming.lookup("rmi://10.0.0.48/server");
s.login(this);
}
@Override
public void talk() throws RemoteException {
System.out.println("Talkiiiing");
}
}
(ClientInterface.java)
public interface ClientInterface extends Remote {
void talk() throws RemoteException;;
}
(サーバー.java)
public class Server extends UnicastRemoteObject implements ServerInterface {
public Server() throws RemoteException, MalformedURLException {
LocateRegistry.createRegistry(1099);
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
Naming.rebind("rmi://localhost:1099/server", this);
}
public static void main(String[] args) {
try {
new Server();
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Override
public void login(ClientInterface clientInterface) throws RemoteException {
clientInterface.talk();
}
}
そして最後に (ServerInterface.java)
public interface ServerInterface extends Remote {
void login(ClientInterface clientInterface) throws RemoteException;
}