【问题标题】:How to connect to EC2 instance using Java RMI?如何使用 Java RMI 连接到 EC2 实例?
【发布时间】:2014-05-21 19:47:46
【问题描述】:

我有一个在 Amazon 中运行的 EC2 实例。其公网 IP 为 54.72.14.247,目前对所有流量开放。

此实例托管一个斐波那契服务器,该服务器在请求时计算斐波那契数列的数字。

服务器的代码很简单(不到30行),可以在下面的链接中看到:

在我的本地计算机中,我有一个尝试访问该服务器的 Java 客户端:

package fiboclient;

import fiboserver.IFibonacci;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class FibonacciClient {

    public static void main(String[] args) {

        System.setProperty("java.security.policy", "client.policy");
        if(args.length == 0 || !args[0].startsWith("rmi:")){
            System.err.println("Usage: java FibonacciClient rmi://host.domain.port/fibonacci number");
            return;
        }

        try{
            Object o = Naming.lookup(args[0]);
            IFibonacci calculator = (IFibonacci) o;

            for(int i = 1; i < args.length; i++){
                try{
                    BigInteger index = new BigInteger(args[i]);
                    BigInteger f = calculator.getFibonacci(index);

                    System.out.println("The " + args[i] + "th Fibonacci number is " + f);
                }catch(NumberFormatException e){
                    System.err.println(args[i] + " is not an integer.");
                }
            }
        }catch(RemoteException e){
            System.err.println("Remote object threw exception " + e);
        } catch (MalformedURLException e) {
            System.err.println(args[0] + " is not a valid RMI URL");
        } catch (NotBoundException e) {
            System.err.println("Could not find the requested remote object on the server");
        }
    }

}

客户端和服务器都有一个策略文件,分别称为server.policyclient.policy。它们都有以下代码:

grant{
    permission java.security.AllPermission;
};

在本地运行: 请记住策略文件位于正确的位置,首先启动服务器,然后使用以下参数启动客户端:rmi://localhost:1099/fibonacci 0 1 2 3 4 5 55 155

一切都会好起来的。

要求 EC2 实例服务器运行: 首先,我在 Ec2 实例上启动了我的服务器。现在,该服务器正在侦听并等待请求。

然后在我的本地机器上,我使用参数rmi://54.72.14.247:1099/fibonacci 0 1 2 3 4 5 55 155 运行客户端,然后我没有得到任何响应。就像字面意思一样,什么也没有发生,我也不知道为什么!

我错过了什么吗?我该如何解决这个问题?

JAR 文件

为了方便,也为了让大家测试用例,我编译了 JARS。运行 JARS 时使用java -jar jarFileName.jar 命令,并确保策略文件与 jar 文件位于同一文件夹中

编辑

安全组截图:

【问题讨论】:

  • 如果这在本地工作,为什么你仍然有两个关于为什么它在本地不工作的问题?
  • 您对问题的理解有误。该应用程序在本地运行良好,但在使用不同机器部署在 Amazon EC2 实例中时无法运行。我应该编辑问题并使其更清楚吗?
  • Flame 你有想过这个吗?我有同样的问题,只是它在两个 EC2 实例之间运行良好,只是不是来自 AWS 外部。

标签: java amazon-web-services jar amazon-ec2 rmi


【解决方案1】:

您是否为入站流量打开了端口?如果不关注these steps。干杯

还有更多直接在amazon上here.

【讨论】:

  • 所有流量都开启了,可以看到我刚刚添加的截图!
  • 你能验证请求是否真的到达了服务器吗?将一些日志记录添加到您的服务器应用程序并检查日志文件,以便您可以查看问题是否真的是入站流量。第二步应该是验证 EC2 上使用的操作系统的防火墙设置。也许您必须在那里打开端口,以及通过我的答案中的第一个链接进行描述。
  • 接下来要验证的是安全组设置:here
  • 我允许 SecurityGroup 上的所有流量,如我在屏幕截图中所示。至于防火墙,我杀了它,所以这也不是问题。最后一次尝试是检查传入服务器的流量,但我不知道该怎么做:S
  • Flame,如果您检查其他线程是否存在类似问题...他们都提到必须明确列出他们遇到问题的端口。试试吧。尝试它并没有什么坏处。对于incomung 请求。简化您的服务器以不进行任何计算,而只需写入文件。将其部署在 EC2 上。执行本地客户端。然后在服务器上检查他的文件是否已创建并写入。
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 2013-12-09
  • 2012-11-23
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2014-02-01
  • 2019-04-03
相关资源
最近更新 更多