如果您想了解Java中的getHostAddress和和getInetAddress的知识,那么本篇文章将是您的不二之选。我们将深入剖析Java中的getHostAddress的各个方面,并为您解答和
如果您想了解Java中的getHostAddress和和getInetAddress的知识,那么本篇文章将是您的不二之选。我们将深入剖析Java中的getHostAddress的各个方面,并为您解答和getInetAddress的疑在这篇文章中,我们将为您介绍Java中的getHostAddress的相关知识,同时也会详细的解释和getInetAddress的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- Java中的getHostAddress()和getInetAddress()(java inetaddress.getlocalhost)
- 7.1(java学习笔记)InetAddress&InetScoketAddress
- android – InetAddress.java调用的“getaddrinfo”的实现在哪里
- c – 从GetAdaptersAddresses()获取IP_ADDRESS_STRING?
- C# .net core GetHostAddresses更新为GetHostAddressesAsync
Java中的getHostAddress()和getInetAddress()(java inetaddress.getlocalhost)
我正在创建TCP套接字应用程序。在服务器端,
ss = new ServerSocket(10000);Socket socket = ss.accept();String remoteIp = socket.getInetAddress().getHostAddress();String RemotePort = ":"+socket.getLocalPort();
我对最后两行有些困惑,getInetAddress()用于返回套接字连接的地址,即主机的地址吗?然后为什么我们需要一个getHostAddress()?
答案1
小编典典socket.getInetAddress()
返回一个InetAddress
包含远程计算机IP地址的对象。
InetAddress.getHostAddress()
返回String
带有该地址文本表示形式的对象。
因此,最终String
可以打印,这就是您要执行的操作。
编辑: 如果您不熟悉,这称为“方法链接”。说的话是一样的:
InetAddress addy = socket.getInetAddress();String remoteIp = addy.getHostAddress();
7.1(java学习笔记)InetAddress&InetScoketAddress
一、InetAddress
这个类主要表示IP地址.InetAddress封装了IP地址和域名。域名可以看做IP地址的一个别称,起这个别称的目的是为了便于记忆。
例如www.baidu.com 就是119.75.217.109的别称,在浏览器地址栏输入119.75.217.109同样可以访问百度首页。明显这个别称更好记忆。
InetAddress封装了IP地址和域名,总之里面的Address就是IP地址,Name就是这个地址的别称。
1.1构造方法,改类的构造方法无法直接调用,需通过返回值为InetAddress的方法来获取对象。
static InetAddress getByName(String host)//根据主机名(可以看做本地电脑的域名)返回InetAddress对象。
host可为IP地址、域名的字符串表示。
static InetAddress getByAddress(byte[] addr)//初始化参数为ip地址的字节数组表示,
例如
new
byte
[]{(
byte
)
192
,(
byte
)
168
,(
byte
)
0
,(
byte
)
81
}
static InetAddress getByAddress(String host,Byte[] addr)//返回host,addr设置的对应对象
static InetAddress getLocalHost()//返回代表本机IP、域名的InetAddress对象。
2.2主要方法
String getHostName()//获取该对象的主机名
String getHostAddress()//获取该对象的IP地址
2.3 例子
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestNet {
public static void main(String[] args) throws UnknownHostException {
//InetAddress 封装了IP和DNS(域名)
InetAddress localhost = InetAddress.getLocalHost();//返回代表本地InetAddress对象
System.out.println(localhost.getHostName());//获取该该对象的IP域名 Ni
System.out.println(localhost.getHostAddress());//获取该对象的IP地址 192.168.17.1
InetAddress a = InetAddress.getByName("localhost");//返回该域名所代表的InetAddres对象
System.out.println(a.getHostName());//获取该对象代表的域名 localhost
System.out.println(a.getHostAddress());//获取该对象代表的IP地址 127.0.0.1
InetAddress b = InetAddress.getByName("192.168.17.1");//返回该IP地址所代表的InetAddress对象
System.out.println(b.getHostName());//返回该对象所代表域名 Ni
System.out.println(b.getHostAddress());//返回该对象的IP地址 192.168.17.1
}
}
Ni
192.168.17.1
localhost
127.0.0.1
Ni
192.168.17.1
上述使用的都是本机地址,所以都可以将IP地址转换为域名。但某些其他外部网络地址会出现无法通过IP解析成域名的情况。
API中有这样一句话:
InetAddress类提供了将主机名解析为IP地址的方法,反之亦然。
将IP地址解析为域名时,如果存在安全管理器,则此方法首先使用主机名和-1作为参数调用其checkConnect方法,
以查看是否允许调用代码知道此IP地址的主机名,即是否连接到主机。如果不允许操作,它将返回IP地址的文本表示。
如果允许则返回域名。
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class TestNet {
public static void main(String[] args) throws UnknownHostException {
InetAddress b = InetAddress.getByName("www.baidu.com");
System.out.println(b.getHostName());
System.out.println(b.getHostAddress());
}
}
运行结果:
www.baidu.com
119.75.217.109
如果将static InetAddress getByName(String host)中的host设置为119.75.217.109,
会导致无法解析的情况发生,这时返回的域名就是这个IP地址本身的文本表示。
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class TestNet {
public static void main(String[] args) throws UnknownHostException {
InetAddress b = InetAddress.getByName("119.75.217.109");
System.out.println(b.getHostName());
System.out.println(b.getHostAddress());
}
}
运行结果;
119.75.217.109
119.75.217.109
简而言之,如果能将IP地址解析成域名getHostName就返回域名,如果不能则返回IP地址本身。
二、InetSocketAddress
InetSocketAddress在InetAddress的基础上封装了端口。
2.1构造方法
InetSocketAddress(InetAddress addr, int port)
InetSocketAddress(String hostname, int port)
//构造方法,hostname可为ip地址也可为主机名 port端口号
传递参数为String 类型的ostname实际上内部是将String hostname转换为了InetAddress addr。
其中的
2.2主要方法
int getPort()//获取端口号
String getHostName()//获取主机名
InetAddress getAddress()//返回一个InetAddress对象
2.3例子
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class TestNet {
public static void main(String[] args) throws UnknownHostException {
//最好不要分配1024以下的端口
InetSocketAddress i = new InetSocketAddress("localhost",2048);//初始化,域名|主机名|地址
//InetSocketAddress e = new InetSocketAddress("127.0.0.1",2049);
System.out.println(i.getAddress().getHostName());
System.out.println(i.getPort());//端口号
InetAddress ia = i.getAddress();//返回一个InetAddress对象
System.out.println(ia.getHostName());//后续就可以调用InetAddress中的方法对其操作 (主机名)
System.out.println(ia.getHostAddress());//主机IP地址
}
}
运行结果:
localhost
2048
localhost
127.0.0.1
android – InetAddress.java调用的“getaddrinfo”的实现在哪里
我最近一直在研究为什么Android操作系统中的浏览器
不支持通过IPv6 URL访问IPv6网站
我认为这是由于本机方法getaddrinfo由android / dalvik / libcore / luni / src / main / java / java / net /调用
InetAddress.java,然后由浏览器应用程序调用
尝试将IPv6 URL转换为时,会抛出UnkNownHostException
它的地址.
从第507行开始,InetAddress.java的代码是:
try {
InetAddress[] addresses = bytesToInetAddresses(getaddrinfo(host), host);
addressCache.put(host, addresses);
return addresses;
并且本机方法在第516行声明为:
private static native byte[][] getaddrinfo(String name)
throws UnkNownHostException;
但我还没有找到任何暗示这个实施的地方
本机方法getaddrinfo虽然我发现有两个文件
名为getaddrinfo.c.这里遵循JNI或NDK的规则吗?如果
所以,System.loadLibary(“NameOfTheLibrary”)的声明应该是
发现但我没有找到它.
任何人都可以给我一个暗示找到这个的实现
本地方法getaddrinfo?
可以在http://ooowjc.wikispaces.com/Attachments找到InetAddress.java的完整源文件
解决方法:
在Android源代码树中,libcore / luni / src / main / native / java_net_InetAddress.cpp.
我在android-git存储库中包含了一个指向该文件的链接,但是site目前似乎已被清除.
c – 从GetAdaptersAddresses()获取IP_ADDRESS_STRING?
typedef struct _IP_ADAPTER_UNICAST_ADDRESS { union { struct { ULONG Length; DWORD Flags; } ; } ; struct _IP_ADAPTER_UNICAST_ADDRESS *Next; SOCKET_ADDRESS Address; IP_PREFIX_ORIGIN PrefixOrigin; IP_SUFFIX_ORIGIN SuffixOrigin; IP_DAD_STATE DadState; ULONG ValidLifetime; ULONG PreferredLifetime; ULONG LeaseLifetime; UINT8 OnLinkPrefixLength;} IP_ADAPTER_UNICAST_ADDRESS,*PIP_ADAPTER_UNICAST_ADDRESS;
似乎建议人类可读的IP地址字符串的唯一字段是Address,它是一个SOCKET_ADDRESS结构,定义如下:
typedef struct _SOCKET_ADDRESS { LPSOCKADDR lpSockaddr; INT iSockaddrLength;} SOCKET_ADDRESS,*PSOCKET_ADDRESS;
反过来,它使用另一种结构SOCKADDR,定义为:
对不起,这是复杂的方式发布在这里,因为它取决于IPv4与IPv6和Windows版本…所以这里是定义的链接:
http://msdn.microsoft.com/en-us/library/ms740496%28v=VS.85%29.aspx
如果你还没有像我那样头晕目眩并且遵循这个定义的迷宫,你可能会注意到检索IP地址的旧的虚线字符串样式是一场噩梦,因为过去使用GetAdaptersInfo()要容易得多.
我的问题是:是否有真正的IP Helper功能可以将IP_ADAPTER_UNICAST_ADDRESS转换为IPv4点分支(或IPv6字符串)?
解决方法
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable,&dwSize,0 )) != NO_ERROR ) { printf("GetIpAddrTable Failed with error %d\n",dwRetVal); if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYstem | FORMAT_MESSAGE_IGnorE_INSERTS,NULL,dwRetVal,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),// Default language (LPTSTR) & lpMsgBuf,NULL)) { printf("\tError: %s",lpMsgBuf); LocalFree(lpMsgBuf); } exit(1);}printf("\tNum Entries: %ld\n",pIPAddrTable->dwNumEntries);for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) { printf("\n\tInterface Index[%d]:\t%ld\n",i,pIPAddrTable->table[i].dwIndex); IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr; printf("\tIP Address[%d]: \t%s\n",inet_ntoa(IPAddr) );
IP_ADAPTER_UNICAST_ADDRESS在地址中包含SOCKET_ADDRESS,后者又包含lpSockAddr中的LPSOCKADDR – 您可以使用WSAAddressToString将其转换为ipv4字符串形式.
C# .net core GetHostAddresses更新为GetHostAddressesAsync
GitHub上的说明
代码:
var candidates = new List<IPAddress>();
//IPAddress[] nodeIps = Dns.GetHostAddresses(addrOrHost);
//结果与原来保持一致
IPAddress[] nodeIps = Dns.GetHostAddressesAsync(addrOrHost).GetAwaiter().GetResult();
关于Java中的getHostAddress和和getInetAddress的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于7.1(java学习笔记)InetAddress&InetScoketAddress、android – InetAddress.java调用的“getaddrinfo”的实现在哪里、c – 从GetAdaptersAddresses()获取IP_ADDRESS_STRING?、C# .net core GetHostAddresses更新为GetHostAddressesAsync等相关内容,可以在本站寻找。
本文标签: