Java에서 RMI를 사용하여 서버/클라이언트 프로그램을 수행하고 있습니다. 서버가 충돌 할 때 문제가 발생하지 않으면 클라이언트는 RemoteException을 가져와 연결을 끊습니다.Java RMI 시간 초과 (충돌)
그러나 클라이언트가 고장 났을 때 문제가 있습니다. 내 서버는 Timer를 사용하여 모든 클라이언트 객체에 ping을 가하고 클라이언트에 연결이 없으면 RemoteException을 잡아냅니다.
그런 다음 서버에서 클라이언트 개체를 제거하기 만하면됩니다 (목록에서 제거). 그러나 프록시 클라이언트 개체를 사용하여 다른 작업을 시도하면 다른 RemoteException이 throw되기 때문에 불가능합니다. 이 문제를 어떻게 해결할 수 있습니까?
List<User> users;
Map<User, IClient> clients;
class PingClients extends TimerTask {
public void run() {
for (IClient client : clients.values())
try {
client.ping();
} catch (RemoteException e) {
//removeClient(client); GENERATES REMOTEEXCEPTION
}
}
}
public boolean removeClient(IClient c) throws RemoteException{
User u = c.getUser();
users.remove(u);
clients.remove(u);
for (IClient client : clients.values())
client.updateUsers(users);
}
클라이언트 프록시를 반복하는 방법을 보여주고 목록에서 삭제하는 방법을 알려주십시오. iterate에 iterator를 사용하고 remove 메소드를 사용하여 현재 프록시를 목록에서 제거하면 RemoteException이 발생하지 않습니다. –
고객을 삭제하는 방법은 여전히 Google에 표시되지 않습니다. removeClient 메소드의 내용은 무엇입니까? –