2013-05-21 3 views
1

이것은 RMI를 사용하여 채팅을 구현하려는 중이지만 rmiregistry의 사용을 피하면서 모든 것이 localhost에 잘 바인딩되어 있습니다. 하지만 난, 포트가 방화벽 아래로, 전달은 인터넷에서 accesible 할 필요가 실제로 내가 인터넷을 통해 객체를 검색 할 수 있습니다, 난이 그럼 내 NameServer.java을 인터넷에서 볼 수 있지만 LAN이 아닌 RMI

System.setProperty("java.rmi.server.hostname","ruso.89.x.ignorelist.com"); 

를 사용 achived했습니다 그 IP에 바인딩하지만 localhost를 통해 모든 액세스 권한을 잃어 버렸습니다. 이제 설명하겠습니다. 그런 다음

grant { 
permission java.security.AllPermission; 
permission java.net.SocketPermission "ruso.89.x.ignorelist.com:*", "connect,resolve,accept"; 
permission java.net.SocketPermission "localhost:*", "connect,resolve,accept"; 
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve,accept"; 
}; 

나는,이 NS를 받아 그것을 자신을 결합하는 ChatServer.java가 실행해야하므로 ChatServer이이 내 정책 파일 NameServer.java

public class NameServer 
{ 
    public static void main (String args []) 
    { 
    String direscucha = "ruso.89.x.ignorelist.com"; 
    int puertonombres = 5000; 
    try{ 

     System.setProperty("java.rmi.server.hostname", direscucha);   
     System.setProperty("java.security.policy", "C:\\Users\\Antonio\\Desktop\\DistributedChat\\myServer.policy"); 
     System.setSecurityManager(new RMISecurityManager()); 
     NameService ns = new NameService(); 
     Registry reg=LocateRegistry.createRegistry(puertonombres); 
     reg.rebind("ns",ns); 
     while(true){} 
    }catch(Exception e){ 
     System.out.println(e); 
    } 
    } 
} 

코드입니다 찾을 수 있습니다, 문제는 내가 내 LAN 외부에서 그것을 사용하여 서버를 실행할 수 있습니다! 내가 localhost를 사용할 때 ServerChat가의 NameService에서 ChatServer의 이름을 검색 ChatClient.java을 실행할 수 있습니다 이제 모든 사용자를 등록 할 때하지만 난 예외

ChatServer.java (발췌문) 그래서

public void work() 
{ 
    String direscucha = "ruso.89.x.ignorelist.com";   
    int puertonombres = 5000; 
    System.setProperty("java.rmi.server.hostname", direscucha); //Binds to the Public IP 
    System.setProperty("java.security.policy", "C:\\Users\\Antonio\\Desktop\\DistributedChat\\myClient.policy"); //marca la politica 
    System.setSecurityManager(new RMISecurityManager()); //Ejecuta el RMISecurityManager 
    try 
    {          
     String[] list = Naming.list("//localhost:5000/"); //Debugging 
     System.out.println("Tamanyo: "+list.length);  
     for(int i=0; i<list.length; i++)     
      System.out.println(list[i]); 
     NameService_Stub ns = (NameService_Stub) Naming.lookup("rmi://localhost:5000/ns"); 

     ns.rebind (conf.getServerName(), this); 
     System.out.println("Servidor registrado::"); 
    } 
    catch (java.rmi.ConnectException e) 
    { 
     System.out.println (e); 
     System.exit(-1);    
    } 
    catch (Exception e) 
    { 
     System.out.println(e); 
     System.exit(-1); 
    } 

있어 그리고 연결했지만 아직 채팅 서버를 관리 할 수 ​​없기 때문에 아직 거기에 도달하지 못했습니다. 내 첫 번째지만 localhost 얻을 차단 된 호스트 이름 속성을 설정할 때 아무데도 언급했다, 이후 라우터 NAT에 문제가있을 수 있지만, 그것은있을 수 있습니까?

예외 :

java.rmi.ConnectException: Connection refused to host: ruso.89.x.ignorelist.com; nested exception is: 
java.net.ConnectException: Connection refused: connect 

클라이언트 및 서버 정책 파일이 동일합니다. WireShark를 사용하여 무슨 일이 일어나고 있는지 확인하고 SYN을 보내고 ACK를 받으면 RST가 수신됩니다. 내 모든 아이디어를 불타 버렸습니다.

답변

0

은 내가이 사용

System.setProperty를 ("java.rmi.server.hostname", "ruso.89.x.ignorelist.com") achived했습니다;

그래서 다음 내 NameServer.java는

아니오 그렇지 않은 해당 IP에 바인딩합니다. 그것은 일반적인 오인이지만 부정확합니다. RMI는 사용자가 RMIServerSocketFactory을 제공하지 않는 한 항상 ServerSockets을 0.0.0.0으로 바인딩합니다. java.rmi.server.hostname의 효과는 그 값을 스텁에 임베드하는 것입니다 (기본적으로 InetAddress.getLocalHost()에 의해 반환되는 값 대신에).

while(true){} 

당신은 그 일을하여 CPU를 연기 할 필요가 없습니다,하지만 당신은 Registry 참조 정적 변수 만들 필요가 없습니다. RMI는, 언인스톨 할 때까지, JVM가 종료하지 않게하는 리모트 오브젝트를 export 할 때, thread를 기동합니다. 비 표시는 원격 객체가 가비지 수집 될 때 자동으로 발생하고 정적 참조가이를 방지합니다.

연결이 거부되었습니다. ruso.89.x.ignorelist.com

이는 내부 방화벽이 사용자의 내부 방화벽에도 연결할 수 있음을 의미 할 수 있습니다. 또는 ruso.89.x.ignorelist.com에는 네트워크 내에 다른 잘못된 DNS 매핑이 있습니다.

+0

'또는 ruso.89.x.ignorelist.com은 네트워크 내에 다른 DNS 매핑이 다릅니다. 방화벽이 다운되었으므로 문제가 될 수 있습니다. 그래서 ChatServer가 등록 된 방식을 바꿀 것이라고 생각합니다. 저는 rmi를 통해 객체를 검색 할 수 있고 Ruso.89.x.ignorelist.com이라는 참조를 통해 스텁에서 방향이 잘못되었음을 확인했습니다. 고맙습니다. 계속 시도해 보겠습니다 ...이 문제를 해결하거나 문제를 해결하는 방법에 대한 제안 사항이 있으면 알려 주시기 바랍니다. –