2015-09-25 76 views
1

我目前使用下面的代码来获取IPv4地址:如何在Akka/Spray框架中获取客户端的IPv6地址?

import spray.http.RemoteAddress 
... 
val ipV4: String = remoteAddress.toOption.map(_.getHostAddress).getOrElse("<unknown>") 

不过,我似乎无法找到做同样的事情对IPv6的任何信息。任何援助对此将不胜感激。

+0

根据该文件,'RemoteAddress.toOption'封装了'java.net.InetAddress'这是一个抽象类,双方IPv4和IPv6地址扩展。假设'remoteAddress'具有IPv6地址,那么您的当前代码应该可以正常工作。 –

+0

@IanMcLaird啊。好的。那么,如何获得远程地址的IPv6版本(与当前提供的IPv4相反)呢? – chaotic3quilibrium

+1

在只能通过IPv6访问的计算机上运行代码。您不需要更改代码。你会得到连接的远程机器的地址。它一次只能从一个地址连接到您。 –

回答

2

它不取决于你的方法 - 它取决于你的网络配置。

spray.http.RemoteAddressLook at the source code

def apply(bytes: Array[Byte]): RemoteAddress = { 
    require(bytes.length == 4 || bytes.length == 16) 
    try IP(InetAddress.getByAddress(bytes)) catch { case _: UnknownHostException ⇒ Unknown } 
} 

此代码封装在IPv4(4字节)和IPv6(16字节)。因此,您将收到IPv4地址,IPv6地址或特殊的Pv4映射到IPv6地址取决于您的网络设置。

尝试在网络接口配置为使用IPv6的本地PC上运行您的代码,您将看到。

这是你实际上从Java接收对象:http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html

+0

我不确定这是否回答我的问题。您的答案意味着我的代码正在接收InetAddress的IPv4实例。那么,我如何从Akka/Spray框架获取InetAddress的IPv6实例呢? – chaotic3quilibrium

+1

同样的方法。它不取决于你的方法 - 它取决于你网络的配置。尝试在网络接口配置为使用ipv6的本地PC上运行代码,您将看到。 –

+0

如果您将更新您的答案,包括您刚才在评论中所说的内容,我会接受它。和tysvm创造答案。 – chaotic3quilibrium

相关问题