저는 몇 시간 동안 RMI 문제로 고심하고 있습니다. 지금은 꽤 바보 같은 예제입니다. 클라이언트가 동일한 컴퓨터에 클라이언트 & 두 개가 모두 실행될 때만 작동합니다. ! 나는에있어 이후 Java 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는 어디서 오는가?
코드는 두 개의 클래스 {Server | Client} 인터페이스를 구현하는 서버 & 클라이언트로 구성됩니다. RMIRegistry에서 서버 객체를 가져오고 로그인 메소드를 호출하는 데 아무런 문제가 없습니다. 코드가 실행되면 서버 측에서 중단 점을 볼 수 있지만 콜백 명령이 오자마자 실패합니다. 예외는 클라이언트 측 btw입니다.
두 컴퓨터 모두에서 방화벽을 사용하지 못하게 시도했습니다. 나는 예외가 나를 보내는 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;;
}
(Server.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;
}
나는 실제로 DNS가 여기에서 왜 호출되는지를 보지 못했다. 어떤 성공도없이 localhost를 127.0.0.1로 변경하려고했습니다. 문제 A.1은 Naming.Loockup (..)을 할 수 없을 때 발생한다고 생각합니다. 그러나 나는 서버의 원격 메소드가 클라이언트의 콜백을 호출하려고 할 때 문제가 발생합니다. 편집 : 나는 당신이 제안한 시도한 및 여전히 동일한 예외가 있습니다 : ( – Cuva
@downvoter 설명하십시오. – EJP
@ user1729268 콜백을 시도 할 때 문제가 발생하면 그것은 클라이언트의 IP 주소 및 DNS 문제입니다. 이 경우 클라이언트 JVM에서 java.rmi.server.hostname을 서버가 사용할 IP 주소로 설정해야하기 때문에 클라이언트가 콜백의 관점에서 볼 때 서버이기도합니다. 클라이언트 방화벽이나 NAT 장치 뒤에 있기 때문에 인바운드 포트가 전달되지 않으면 작동하지 않으며 java.rmi.server.hostname을 NAT 장치의 IP 주소로 설정해야합니다. – EJP