发送最后一条消息后发生Java RMI RemoteException

时间:2011-11-17 17:03:27

标签: java rmi remoteexception

所以我使用RMI在Java中创建了一个客户端/服务器对。重点是从客户端向服务器发送消息,并打印出我们收到的消息数量以及丢失的消息数量(我将其与UDP进行比较,因此不要问为什么我期望丢失任何RMI消息)。

所以无论如何,编写代码,一切似乎工作正常,我绑定到服务器并发送消息,服务器接收它们并输出结果。

唯一的问题是,在我从客户端发送最后一条消息后,它会抛出一个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."); 
    } 

如果我选择要发送的1000条消息,它将从0-999发送消息。

从服务器打印出结果后,我立即调用System.exit(),这可能导致它提前终止而无需等待来自客户端的相应响应?

如果你能提供帮助,我将非常感激,如果你需要更多信息,我很乐意提供。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您无法在远程方法中关闭服务器。服务器必须发回OK或异常状态,或者如果方法有一个返回值,那就是客户端在尝试接收时失败的状态。您必须安排关机以稍后执行。