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