我启动服务器套接字,希望它监听环回地址(127.0.0.1)。代码如下: ......
Inet4Address address = (Inet4Address) Inet4Address.getByName("localhost");
TServerSocket server = new TServerSocket(new InetSocketAddress(address ,1234));
.........
public class TServerSocket{
......
public TServerSocket(InetSocketAddress bindAddr, int clientTimeout) throws TTransportException {
clientTimeout_ = clientTimeout;
try {
serverSocket_ = new ServerSocket();
serverSocket_.setReuseAddress(true);
serverSocket_.bind(bindAddr);
} catch (IOException ioe) {
serverSocket_ = null;
throw new TTransportException("Could not create ServerSocket on address " + bindAddr.toString() + ".");
}
}
......
}
但我发现这个套接字开始使用命令“netstat”侦听IPv6地址“:ffff:127.0.0.1”,它 导致在另一个进程(在Python中)运行的客户端无法通过“127.0.0.1”连接到此服务器。
为什么android会自动将IPV4地址映射到IPv6地址?
答案 0 :(得分:0)
它没有将IPv4地址映射到IPv6。 Inet4Address
和Inet6Address
没有实现getByName()
方法,因此您实际上使用的是InetAddress
中的继承方法。如果IPv4和IPv6都可以访问主机,则大多数操作系统都会选择IPv6 over IPv4(您应该这样:))。您可以尝试按InetAddress.getAllByName("localhost")
获取地址数组,然后检查地址是Inet4Address
的实例(或其他情况下为Inet6Address
),但此示例的最简单解决方案是对环回进行硬编码地址(127.0.0.1),因为它几乎没有变化的可能性。
答案 1 :(得分:0)
它不是在监听IPv6本身,netstat(在Android上)只打印出编码为IPv6地址的IPv4地址(127.0.0.1)。即使网络只是IPv4,它也适用于所有套接字。
此处有更多详情:http://www.tcpipguide.com/free/t_IPv6IPv4AddressEmbedding.htm