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