所以我使用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(),这可能导致它提前终止,而无需等待来自客户端的适当响应?
如果你能帮助我,我将非常感激,如果你需要更多的信息,我很乐意提供。
您不能在远程方法中关闭服务器。服务器必须返回一个OK或异常状态,如果方法有返回值,则返回值,这就是客户端在尝试接收时失败的原因。