Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图获取InetAddress.getLocalHost.getHostAddress(Java/Scala)以返回外部IP_Java_Scala_Networking_Localhost_Akka - Fatal编程技术网

试图获取InetAddress.getLocalHost.getHostAddress(Java/Scala)以返回外部IP

试图获取InetAddress.getLocalHost.getHostAddress(Java/Scala)以返回外部IP,java,scala,networking,localhost,akka,Java,Scala,Networking,Localhost,Akka,因此,我在使用InetAddress.getLocalHost.getHostAddress获取给定机器的外部IP地址时遇到了问题 在某种意义上,我实际上是在Scala中这样做的——Akka Remote Actors的配置文件默认使用InetAddress.getLocalHost.getHostAddress来获取机器的IP地址,这是我想要的,因为我将在多台机器上部署Actors。但是,它似乎返回的是127.0.0.1,而不是我想要的外部IP地址(因为远程参与者需要在netwrok上来回通信

因此,我在使用
InetAddress.getLocalHost.getHostAddress
获取给定机器的外部IP地址时遇到了问题

在某种意义上,我实际上是在Scala中这样做的——Akka Remote Actors的配置文件默认使用
InetAddress.getLocalHost.getHostAddress
来获取机器的IP地址,这是我想要的,因为我将在多台机器上部署Actors。但是,它似乎返回的是
127.0.0.1
,而不是我想要的外部IP地址(因为远程参与者需要在netwrok上来回通信)

问题是,我无法使用我在谷歌上找到的任何方法来规避这一问题,因为它们似乎都涉及到调整代码本身,而这里我没有任何代码需要调整,DSL只是自动使用
InetAddress.getLocalHost.getHostAddress

我从谷歌搜索中读到一些帖子,你可以通过编辑你的主机文件或其他什么来规避这个问题?我该怎么做

谢谢! -kstruct

您可能希望使用类


特别是,使用静态方法枚举所有可用的网络接口。

检查/etc/hosts文件。它应该将“localhost”映射到127.0.0.1,将您的真实主机名映射到您的真实IP地址,或者映射到其中一个地址:-一些Linux发行版显然弄错了。

如果getLocalHost不起作用,我得到了部分解决方案。 此解决方案存在一个问题,即您必须知道网络接口的名称,以便与实际接口匹配。也许您可以通过删除“虚拟”设备和其他东西来改进此代码

这是scala代码,但java代码非常类似

  def returnInterfaceAddress() : InetAddress = {
    var myInetAddress = InetAddress.getLocalHost
    val interfaces : util.Enumeration[NetworkInterface] = NetworkInterface.getNetworkInterfaces()
    while(interfaces.hasMoreElements){
      val inter = interfaces.nextElement()
      if(inter.getDisplayName() == "Realtek PCIe GBE Family Controller"){
        myInetAddress = inter.getInetAddresses().nextElement()
      }
    }
    myInetAddress
  }

我不认为我能做到这一点-没有代码可以修改。这正是Akka Remote Actor配置文件的工作方式—如果未指定主机名,它将使用
InetAddress.getLocalHost.getHostAddress
,我自己永远不会使用它@卡车。你和安全经理一起跑吗?getLocalHost的文档说明,如果您没有正确的权限,该方法将始终返回loopback address.Hm。。我现在对JVM不太熟悉,你能解释一下我将如何确定我是否使用这个“安全管理器”运行吗?如果相关的话,我肯定没有远程机器的root访问权限。@kstrct。获取启动java应用程序的命令行(Windows上的ProcessExplorer,Linux上的ps),并检查是否在命令行的某个位置看到此
java.security.manager
。不,我看到的唯一与Java相关的东西是
Java-XX:+cmsclasssunloadingerabled-Xms1536m-Xmx1536m-XX:MaxPermSize=384m-XX:ReservedCodeCacheSize=192m-Dfile.encoding=UTF8
@yanghaogn我不认为删除信息是“让它更清晰”。编辑被拒绝。