我有这个相当简单的 RMI 通信。
服务器:
LocateRegistry.createRegistry(settings.rmiPort).bind("server", UnicastRemoteObject.exportObject(remoteMe, 0));
private final class RemoteLobbyServerImpl implements RemoteLobbyServer {
@Override public void registerRobotServer(RemoteRobotServer robotServer, int seq) throws RemoteException {
System.out.println(String.valueOf(seq));
// robotManager.setServer(robotServer);
}
}
客户:
final Registry registry = LocateRegistry.getRegistry(lobbyHost, lobbyRmiPort);
log.info("Looking up lobbyserver...");
remoteLobbyServer = (RemoteLobbyServer) registry.lookup("server");
log.info(remoteLobbyServer.toString());
remoteMe = new RemoteRobotServerImpl();
final int seq = (int)(Math.random() * 10);
log.info("Registering myself "+seq+" ...");
Future<?> registerTask = ThreadPool.submit(new Runnable() { @Override public void run() {
try {
remoteLobbyServer.registerRobotServer((RemoteRobotServer) UnicastRemoteObject.exportObject(remoteMe, 0), seq);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
log.info("Registered");
}});
try {
registerTask.get(30, TimeUnit.SECONDS);
} catch (TimeoutException e) {
registerTask.cancel(true);
throw new RuntimeException("Registration timed out");
}
当我在同一台机器上运行它时,它工作正常。但是,当客户端和服务器之间存在一定距离时,它就会分崩离析。然后服务器响应大约需要 2 分钟。
Linux 的 ping 表示延迟为 20 毫秒。奇怪的是,它确实需要一段时间才能显示出来,而例如 ping google.com(也是 20 毫秒)的结果相当快。
会发生什么?我该如何分析这个?