2011-11-17 2 views
0

그래서 RMI를 사용하여 Java에서 클라이언트/서버 쌍을 만들었습니다. 요점은 클라이언트에서 서버로 메시지를 보내고 얼마나 많은 메시지를 받았는지와 잃어버린 메시지의 수를 출력하는 것입니다 (UDP와 비교하면 왜 RMI를 잃을 지 기대하지 않습니다).마지막 메시지를 보낸 후 Java RMI RemoteException

어쨌든, 코드를 작성, 모든게 잘 작동하는 것, 나는 서버에 바인딩하고 메시지를 보내, 서버가 모두 받고 결과를 출력합니다.

문제는 클라이언트에서 마지막 메시지를 보낸 후에 RemoteException이 발생하고 그 이유를 알 수 없습니다.

나의 유일한 추측은 서버가 더 이상 서버에 접속할 수 없다는 것을 알려주므로 (즉, 내 iRMIServer 변수가 유효하지 않음) 서버가 주먹을 끈다는 것입니다.

재미있는 점은 메시지를 보낸 후에 클라이언트가 종료되므로 클라이언트가 먼저 종료된다고 생각합니다. 첫 번째로 종료되지 않는 이유는 메시지 수신을 확인하기 위해 서버에서 응답 (ACK)을 기다려야하기 때문입니다.

아마도 서버가이 중첩 시간에 답장을 보내서 모든 사항이 정상이라고 응답하면 서버가 종료되고 다시 연결할 수 없습니다.

try { 
     iRMIServer = (RMIServerI) Naming.lookup(urlServer); 

     // Attempt to send messages the specified number of times 
     for(int i = 0; i < numMessages; i++) { 
      MessageInfo msg = new MessageInfo(numMessages,i); 
      iRMIServer.receiveMessage(msg); 
     } 
    } catch (MalformedURLException e) { 
     System.out.println("Errpr: Malformed hostname."); 
    } catch (RemoteException e) { 
     System.out.println("Error: Remote Exception."); 
    } catch (NotBoundException e) { 
     System.out.println("Error: Not Bound Exception."); 
    } 

을 내가 보낼 수 천 메시지를 선택하면 그래서 0-999에서 메시지를 보내고 다음과 같이

클라이언트 측에서 메시지를 보내기위한 코드입니다.

서버에서 결과를 인쇄 한 후 클라이언트에서 적절한 응답을 기다리지 않고 일찍 종료 될 수있는 System.exit()을 즉시 호출합니다.

내가 크게 감사 할 수 있도록 도와 주시고, 더 많은 정보가 필요하시면 알려 주시면 기꺼이 도와 드리겠습니다.

미리 감사드립니다.

+0

예외의 스택 추적을 표시 할 수 있습니까? – Tudor

답변

0

원격 메소드 중에 서버를 종료 할 수 없습니다. 서버는 OK 또는 예외 상태 또는 메서드에 값이 있으면 반환 값을 반환해야하며 클라이언트가 수신하려고 할 때 실패하고있는 것입니다. 조금 후에 실행하려면 시스템 종료를 예약해야합니다.

+0

system.exit()이 없으면 서버가 전혀 종료되지 않는다는 문제점이있었습니다. 서버를 종료 할 때마다 서버 레지스트리에서 모든 것을 언 바인드하면이 문제를 해결할 수 있습니다. – Blue42

+0

@ Blue42 또한 원격 객체에 대한 정적 참조가 없는지 확인해야합니다. DGC가 시작될 때까지 기다리지 않고 구체적으로 안보임으로써 속도를 높일 수 있습니다. – EJP