2013-04-15 1 views
0

RMI를 사용하여 서버와 클라이언트 간의 통신을 시도 할 때 문제가 있습니다. 내 코드는 아래에 첨부되어 있습니다. 서버가 잘 실행됩니다. PC 포트 목록에서 수신 대기 포트를 볼 수 있습니다. 클라이언트는 registry.lookup에서 실패합니다. 나는 비슷한 문제를 발견하지 못했다. 도와주세요.registry.lookup을 호출 할 때 테이블에 해당 객체가 없습니다.

서버 :

public class Main { 

private static int port = Registry.REGISTRY_PORT; 
private static Registry registry; 
/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    if (args.length == 1) { 
     try { 
       port = Integer.parseInt(args[0]); 
       } 
      catch (NumberFormatException e) { 
    System.out.println("Port number is not valid!"); 
    System.exit(0); 
      } 
} 

    if (System.getSecurityManager() == null) 
     System.setSecurityManager(new RMISecurityManager()); 
String name = "DBInterface"; 

    System.out.println("Starting server."); 

    try {   
     DBInterface DBInterface = new DBClass(); 
     DBInterface stub = (DBInterface) UnicastRemoteObject.exportObject(DBInterface, 5000); 
     registry = LocateRegistry.createRegistry(port); 
     registry.rebind(name, stub); 
    } 
    catch (RemoteException e) 
    { 
     System.out.println(e.getMessage()); 
    } 
    System.out.println("Server succesfully started."); 

} 

}

클라이언트 : 당신은 기본적으로 불가능 무엇을 설명

public class Client { 

private static String ipAddress = "localhost"; 
private static int port = Registry.REGISTRY_PORT; 
private static String confFile = ""; 
public static DBInterface dbServer = null; 
public static String name = "DBInterface"; 

public static void main(String[] args) { 
    System.out.println("Starting client."); 

    if (System.getSecurityManager() == null) 
     System.setSecurityManager(new RMISecurityManager()); 


    if (args.length == 3) { 
     try { 
      ipAddress = args[0]; 
      port = Integer.parseInt(args[1]); 
      confFile = args[2]; 
     } 
     catch (NumberFormatException e) { 
    System.out.println("Port number is not valid!"); 
    System.exit(0); 
     } 
} 
    else 
    { 
     System.out.println("Some parameter is missing!"); 
     System.out.println("Valid parameters are: IP(0) Port(1) Config_file_name(2)."); 
    } 

    ArrayList<ArrayList<String>> commands = Tools.loadConfigFile(confFile); 
    Iterator<ArrayList<String>> commandsIterator = commands.iterator(); 
    Registry registry; 

try { 
     registry = LocateRegistry.getRegistry(ipAddress, port);  
     dbServer = (DBInterface) registry.lookup(name); //code fails here     
} catch (RemoteException e) { 
     System.out.println(e.getMessage()); //"no such object in table" is printed on the screen 
} catch (NotBoundException e) { 
     System.out.println(e.getMessage()); 
}   
    Tools tools = new Tools(dbServer); 

...

+0

'lookup()'을 호출 할 때 이것을 얻는다고 믿기 어렵습니다. 조회 결과 객체에 대한 원격 메소드를 호출 할 때 가져 오지 않았습니까? – EJP

+0

빠른 답변을 주셔서 감사합니다. 내가 netbeans에서 클라이언트를 디버깅보다 명령 줄에서 서버를 실행합니다. 줄 단위로 이동하고 "dbServer = (DBInterface) registry.lookup (name);" try 블록에서 실패하면 catch는 "no such object in table"을 출력합니다. catch 문에 system.exit을 넣는 것을 잊었 기 때문에 프로그램이 계속되지만, 나중에 원격 메소드를 호출 할 때 실패합니다. – MBI

+0

전체 스택 추적을 게시하십시오. 대답을 편집하십시오. – EJP

답변

1

. 이 예외는 사용중인 스텁 (이 경우 레지스트리)이 더 이상 대상 JVM에있는 활성 내 보낸 객체를 참조하지 않는다는 것을 의미합니다. 그러나 레지스트리 스텁은 로컬에서 생성되기 때문에 만료 기한이 없습니다. 유일한 메카니즘은 당신이 작성한 레지스트리이지만, 정적 인 레지스트리 레퍼런스는 그것을 방지해야합니다.

DBInterface stub = (DBInterface) UnicastRemoteObject.exportObject(DBInterface, 5000); 
    registry = LocateRegistry.createRegistry(port); 
이 두 줄을 역

및 레지스트리와 수출 모두 port를 사용

는 비록 몇 가지를 변경합니다. 두 개의 포트가 필요하지 않습니다. 또한 모든 catch 블록에서 예외 메시지를 사용자 자신의 제어하에 억제하지 마십시오. 실제 예외 메시지는 항상 기록해야합니다.

+0

불가능하지만, 일어난 :) 그러나 조언은 나에게 방향을 알려 주었고 코드는 현재 작동 중이다. 그것은 아마도 두 개의 포트 때문이었을 것입니다. 하나는 기본값 1099 였고 수동으로 설정 한 다른 값은 5000이었습니다. 포트 5000을 사용할 때 코드가 실패했습니다. 제게 조언 한대로이 두 행을 바꿨습니다. 클라이언트가 5000 개가 아닌 1099 개 포트에 연결하고 코드가 더 이상 실패하지 않습니다. 조언 주셔서 감사 드리며 좋은 하루 보내십시오. – MBI

+0

클라이언트에서 포트 5000을 사용하는 것이 문제였습니다. 포트 5000에서 실행되는 레지스트리는 없었습니다. 항상 포트 1099에있었습니다. 포트가 명령 행에서 나오기 때문에 클라이언트 코드에서 분명하지 않았습니다. – EJP