0

このかなり単純な 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 ミリ秒) ではかなり迅速に結果が得られます。

何が起きているのでしょうか?これをどのように分析できますか?

4

0 に答える 0