2016-12-13 4 views
0

채팅을 개발하고 있는데, 먼저 소켓과 스트림을 사용하여 서버와 클라이언트간에 통신을했습니다.이 서버와 클라이언트는 이미 친구들과 테스트를 거쳤으며 작동했습니다. 이제 저는 RMI로 변환하려고합니다.RMI에 주소 및 포트 바인드

로컬로 작동하지만 친구가 연결을 시도하면 연결이 거부됩니다. 더 이상한 것은 서버 로컬 IP (192.168.25.28)를 보여줍니다.

내 코드는 다음과 같습니다

public void conectar() throws RemoteException, MalformedURLException, NotBoundException{ 
    // COMUNICADOR SERVIDOR (USADO PELO CLIENTE) 
    comunicadorServidor = new ComunicadorServidor(id); // cria um novo comunicador 
    LocateRegistry.createRegistry(8081); // inicia o registro RMI na porta 8081 
    Naming.rebind("//:8081/ComunicadorServidor", comunicadorServidor); // vincula o objeto comunicador ao endereço RMI 
    // COMUNICADOR CLIENTE (USADO PELO SERVIDOR) 
    comunicador = (IComunicadorCliente) Naming.lookup("//" + conexao.getInetAddress().getHostAddress() + ":8082/ComunicadorCliente"); // procura o comunicador no cliente 
} 

그래서 나는 서버와 클라이언트 모두에서 RMI를 사용하여 하나의 서버에서 내가 인증 등의 방법을 가지고 있기 때문에, 각각 다른 연결과 메시지의 cliente 사용하는 보내기 , 그리고 클라이언트에서 나는 서버가 사용하는 Update User List와 Receive Message와 같은 메소드를 가지고있다.

먼저 RMI 클래스 (서버 측)의 인스턴스를 만들고 포트 8081에서 레지스트리를 만든 다음 포트 8081에 "ComunicadorServidor"라는 이름으로 개체를 바인딩하십시오.

그런 다음 서버는 클라이언트 RMI에 연결을 시도합니다.

리 바인딩 방법에 대해 읽었을 때 주소를 지정하지 않으면 요청한 로컬 호스트 주소에 바인드됩니다. 로컬 컴퓨터에 바인딩하는 경우에도 여전히 외부에서 사용할 수 있습니까? 그렇지 않다면 소켓과 같은 위치에 바인딩 할 수 있습니다. 여기서 포트를 지정하면 localhost, 로컬 IP 또는 외부 IP와 같은 모든 주소에서 사용할 수 있습니다.

그리고 조회에 관해서는 클라이언트 IP를 얻는 가장 좋은 방법은 무엇입니까 (지금은 소켓에서 가져오고 있습니다), 어떻게하면 올바른 IP를 얻을 수 있을까요? 소켓없이 클라이언트 RMI에 연결할 수 있습니까?

클라이언트 측에서는 RMI 클래스를 8082에 바인드하고 제공된 IP 및 포트를 사용하여 서버 측에서 RMI 클래스를 검색한다는 점을 제외하고는 똑같은 것이 중요합니다.

답변

0

이상한 점은 서버 로컬 IP (192.168.25.28)를 보여줍니다.

맞습니다. 공인 IP 주소에 나타나려면 java.rmi.server.hostname을 찾아보고 RMI FAQ의 항목 A.1을 참조하십시오.

그래서 리 바인딩 방법에 대해 읽었고 주소를 지정하지 않으면 요청한 로컬 호스트 주소에 바인드됩니다 : 로컬 컴퓨터에 바인딩되어 있어도 여전히 사용할 수 있습니까? 외부?

레지스트리는 서버 측 방화벽 규칙이 허용하는 경우 외부에서 사용할 수 있습니다. RMI의 의미에서 bind은 원격 객체를 레지스트리의 이름과 연결한다는 의미입니다. Socket.bind()과는 아무런 관련이 없습니다.

그리고 조회에 관해서는 클라이언트 IP (현재 소켓에서 가져 오는 것)를 얻는 가장 좋은 방법은 무엇이며 어떻게 올바른 IP를 얻을 수 있습니까? 소켓없이 클라이언트 RMI에 연결할 수 있습니까?

RMI에는 '연결'할 수 없지만 클라이언트의 IP 주소는 필요하지 않습니다. 클라이언트는 원격 객체를 서버 원격 메소드를 통해 서버에 등록해야합니다. register(Client client) throws RemoteException.그런 다음 서버에는 클라이언트 원격 메소드를 직접 호출 할 수있는 스텁이 있습니다 (클라이언트 측 방화벽 허용).

+0

나는 당신이 말한 것에 대해 방금 읽었습니다. 그건 괜찮아요, 영리한 서버에 어떤 개체를 내보낼 자신의 원격 개체를 사용하십시오. 나는 내일 그것을 시도 할 것이고, 당신에게 여기에서 알릴 것이다. – Deeh

+0

정말 고마워! 서버가 클라이언트에서 가져와야하는 클래스에서 유니 캐스트 확장을 제거하여 exporteObject 메서드를 사용할 수있게되었습니다. – Deeh

관련 문제