【问题标题】:Get public IP Address of the current machine using scala [duplicate]使用scala获取当前机器的公共IP地址[重复]
【发布时间】:2016-07-15 09:26:54
【问题描述】:

我想获得一个可以在我的机器或局域网之外使用 scala 访问的 IP 地址。

用例场景:Web 服务正在机器上运行。在其响应中,它应该返回其端点之一的 url。所以现在我必须提供运行 Web 服务的机器的 IP

我使用 NetworkInterface.getNetworkInterfaces() 来获取主机上所有已知的网络接口,然后遍历每个 NI 的地址。但在这种情况下,我得到了很多 IP 地址。我怎样才能从所有这些中找出正确的 IP。 下面是scala中的sn-p代码:

private def ipAddress: String = {

  val enumeration = NetworkInterface.getNetworkInterfaces.asScala.toSeq
  val ipAddresses = enumeration.flatMap(p =>
    p.getInetAddresses.asScala.toSeq
  )
  val address = ipAddresses.find { address =>
    val host = address.getHostAddress
    host.contains(".") && !address.isLoopbackAddress && !address.isAnyLocalAddress && !address.isLinkLocalAddress
  }.getOrElse(InetAddress.getLocalHost)

}

【问题讨论】:

  • 这不是 Scala 问题。仅从 IP 列表中无法回答。什么是“正确”地址取决于您机器周围的网络路由。可能没有外部可访问的地址(例如,这对于我正在输入的机器来说是正确的)。因此,请详细说明您的方案以及您正在尝试做的事情。
  • 还有其他几个问题可以解决这个问题。参见,例如stackoverflow.com/questions/1145899/…
  • 网络服务正在机器上运行。在其响应中,它应该返回其端点之一的 url。所以现在我必须提供运行 Web 服务的机器的 IP。
  • 如果有多个接口,则没有单一的“机器IP”。而且它拥有的任何 IP 都不一定是外部使用的 IP - 例如,如果有 Web 代理或端口转发。因此,您需要解释 Web 客户端在哪里,并了解流量将如何从客户端传输到服务器。然后你就可以确定哪个 IP 地址可能是相关的。

标签: java scala sockets networking ip


【解决方案1】:

您必须使用 here 提到的 whatismyip 之类的外部服务

等效的 scala 代码将是 ,

def ipAddress(): String = {
  val whatismyip = new URL("http://checkip.amazonaws.com")
  val in:BufferedReader = new BufferedReader(new InputStreamReader(
                whatismyip.openStream()))
  in.readLine()
} 

【讨论】:

  • 请注意,这只是告诉您来自您的机器来自哪个 IP 地址流量。这并不一定意味着您的机器可以通过该地址访问。
猜你喜欢
  • 2018-10-22
  • 2012-03-17
  • 2016-12-05
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
相关资源
最近更新 更多