所以我使用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(),这可能导致它提前终止而无需等待来自客户端的相应响应?
如果你能提供帮助,我将非常感激,如果你需要更多信息,我很乐意提供。
提前致谢。
答案 0 :(得分:0)
您无法在远程方法中关闭服务器。服务器必须发回OK或异常状态,或者如果方法有一个返回值,那就是客户端在尝试接收时失败的状态。您必须安排关机以稍后执行。