RMI 不通过 Internet 返回响应

问题描述

我有一个简单的 rmi-server 和 rmi-client。当我在同一网络中运行此服务器和客户端时,我的服务器功能正确返回结果。但是我的服务器和客户端在不同的网络中,如果处理时间超过 3-4 分钟,客户端无法得到结果,尽管服务器完成了操作。

这是我的整个服务器代码

public class SimpleServer {

    ServerRemoteObject mRemoteObject;

    public static int RMIInPort = 27550;
    public static int delay = 0;
    
    public byte[] handleEvent(byte[] mMessage) throws Exception {

        String request = new String(mMessage,"UTF-8");

//      if ("hearthbeat".equalsIgnoreCase(request)) {
//          System.out.println("returning for hearthbeat");
//          return "hearthbeat response".getBytes("UTF-8");
//      }

        System.out.println(request);

        Thread.sleep(delay);

        System.out.println("returning response");
        return "this is response".getBytes("UTF-8");
    }
    
    public void bindYourself(int rmiport) {
        try {
            mRemoteObject = new ServerRemoteObject(this);
            java.rmi.registry.Registry iRegistry = LocateRegistry.getRegistry(rmiport);
            iRegistry.rebind("Server",mRemoteObject);
        } catch (Exception e) {
            e.printstacktrace();
            mRemoteObject = null;
        }
    }

    public static void main(String[] server) {

        int rmiport = Integer.parseInt(server[0]);
        RMIInPort = Integer.parseInt(server[1]);
        delay = Integer.parseInt(server[2]);

        System.out.println("server java:" + System.getProperty("java.version"));
        System.out.println("server started on:" + rmiport + "/" + RMIInPort);
        System.out.println("server delay on:" + delay);

        SimpleServer iServer = new SimpleServer();
        iServer.bindYourself(rmiport);

        while (true) {
            try {
                Thread.sleep(10000);
            } catch (Exception e) {
                e.printstacktrace();
            }
        }
    }

}

这是我的客户端代码

public class SimpleClient {

    ISimpleServer iServer;

    public SimpleClient(String p_strServerIp,String p_strCMName,int nRMIPort) {
        try {
            if (nRMIPort == 1099) {
                iServer = (ISimpleServer) Naming.lookup("rmi://" + p_strServerIp + "/" + p_strCMName);
            } else {
                Registry rmiRegistry = null;

                rmiRegistry = LocateRegistry.getRegistry(p_strServerIp,nRMIPort);

                iServer = (ISimpleServer) rmiRegistry.lookup(p_strCMName);
            }
        } catch (Exception ex) {
            ex.printstacktrace();
            iServer = null;
        }
    }

    public static void main(String... strings) {

        String ip = strings[0];
        int rmiport = Integer.parseInt(strings[1]);

        System.out.println("client java:" + System.getProperty("java.version"));
        System.out.println("client is looking for:" + ip + ":" + rmiport);

        SimpleClient iClient = new SimpleClient(ip,"Server",rmiport);

        try {

            byte[] response = iClient.iServer.doaction("this is request".getBytes("UTF-8"));

            System.out.println(new String(response,"UTF-8"));
        } catch (Exception e) {
            e.printstacktrace();
        }

    }

}

这是我的 rmi-registry 代码

public class SimpleRMI implements Runnable {

    Registry mRegistry = null;

    public SimpleRMI(int nPort) {
        try {
            mRegistry = new sun.rmi.registry.RegistryImpl(nPort);
        } catch (remoteexception e1) {
            e1.printstacktrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(360000);
            } catch (Exception e) {
                e.printstacktrace();
            }
        }
    }

    public static void main(String... strings) {
        
        int rmiport = Integer.parseInt(strings[0]);
        
        System.out.println("rmi java:" + System.getProperty("java.version"));
        System.out.println("rmi started on:" + rmiport);

        SimpleRMI iRegisry = new SimpleRMI(rmiport);

        Thread tThread = new Thread(iRegisry);

        tThread.start();

        byte[] bytes = new byte[1];
        while (true) {
            try {
                system.in.read(bytes);
                if (bytes[0] == 13) {
                    try {
                        iRegisry.listRegistry();
                    } catch (Exception exc2) {
                        exc2.printstacktrace();
                    }
                }
            } catch (Exception exc) {
                exc.printstacktrace();
            }
        }

    }

    private void listRegistry() {

        String[] strList = null;
        try {
            strList = mRegistry.list();
            if (strList != null) {
                for (int i = 0; i < strList.length; i++) {
                    int j = i + 1;
                    String name = strList[i];
                    java.rmi.Remote r = mRegistry.lookup(name);
                    System.out.println(j + ". " + strList[i] + " -> "
                            + r.toString());
                }
            }
            System.out.println();
        } catch (Exception exc) {
            exc.printstacktrace();
        }

    }
}

以及我的远程接口和远程对象:

public interface ISimpleServer extends java.rmi.Remote {

    public byte[] doaction(byte[] message) throws java.rmi.remoteexception;
}

@SuppressWarnings("serial")
public class ServerRemoteObject extends UnicastRemoteObject implements ISimpleServer {

    SimpleServer Server = null;

    public ServerRemoteObject(SimpleServer pServer) throws remoteexception {
        super(SimpleServer.RMIInPort);
        Server = pServer;
    }

    @Override
    public byte[] doaction(byte[] message) throws remoteexception {
        try {
            return Server.handleEvent(message);
        } catch (Exception e) {
            e.printstacktrace();
            return null;
        }
    }

}

当我在不同的网络中运行客户端和服务器时。 (我在家庭网络中运行客户端),如果延迟超过 3-4 分钟,服务器会打印返回响应,但客户端仍在等待响应。如果延迟只有1分钟,客户端就可以正常得到结果。

你能帮我找出问题所在吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)