0

因此,我使用 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() 这可能导致它提前终止而不等待来自客户端的适当响应?

如果您能提供帮助,我将不胜感激,如果您需要更多信息,我很乐意提供。

提前致谢。

4

1 回答 1

0

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

于 2011-11-17T22:13:10.810 回答