簡(jiǎn)介
netty是個(gè)好東西,如果不是機(jī)緣巧合之下去咬咬牙學(xué)了一下已骇,可能就接觸不到那么多厲害的技術(shù)了离钝。
反正目標(biāo)就是徹底搞明白Netty!!!
為此必須鋪墊很多的基礎(chǔ)知識(shí),這里面知識(shí)用到最多的就是java的網(wǎng)絡(luò)部分褪储,java線程卵渴,java的io部分的知識(shí)了
因此我們會(huì)觸類旁通地把所有netty要的知識(shí)點(diǎn)解釋清楚
概覽
這個(gè)小系列主要會(huì)解釋一波java網(wǎng)絡(luò)編程是怎么回事,在此先列出目錄來(lái)
因?yàn)橛泻芏嘀R(shí)點(diǎn)是穿插著的,必要的時(shí)候我會(huì)做相應(yīng)的解釋
- Internet地址
- URL
- HTTP相關(guān)概念
- 模擬請(qǐng)求
- socket編程(簡(jiǎn)單的bio編程)
- UDP編程
基本的網(wǎng)絡(luò)概念
好鲤竹,那么我們進(jìn)入正題浪读,既然要學(xué)會(huì)java的網(wǎng)絡(luò)編程,持著盡量不漏掉必要的知識(shí)點(diǎn)辛藻,我們從最基礎(chǔ)的東西說(shuō)起
當(dāng)然碘橘,網(wǎng)絡(luò)要知道全部的東西是要三大本的~ 在此我們只會(huì)觸碰那些必須的東西
Internet地址
網(wǎng)絡(luò)地址簡(jiǎn)單的來(lái)說(shuō)可以分為 IPv4與IPv6的地址,目前大體上IPv4的地址承擔(dān)90%的業(yè)務(wù)請(qǐng)求
IPv4(a.b.c.d形式)吱肌,abcd是0~255的數(shù)字蛹屿。
IPv6(a.b.c.d.e.f形式),abcdef是16進(jìn)制數(shù)
當(dāng)然人類的記憶是很差勁的,數(shù)字的ip根本記不住岩榆。怎么辦呢错负?通過(guò)DNS查詢--只需要記住一個(gè)ip的別名,就可以查到這個(gè)別名對(duì)應(yīng)的ip網(wǎng)址
InetAddress類
java中勇边,InetAddress類是對(duì)IPv4與IPv6的封裝犹撒,可以通過(guò)此類獲得與ip相關(guān)的很多信息
獲取實(shí)例
//你可以傳入一個(gè)主機(jī)名得到一個(gè)InetAddress對(duì)象。
//還可以反向查找粒褒,例如识颊,如果希望得到地址208.201.239.100的主機(jī),可以向getByName()傳入一個(gè)分四段地址來(lái)得到一個(gè)InetAddress對(duì)象
InetAddress.getByName();
//方法會(huì)為運(yùn)行這個(gè)代碼的主機(jī)返回一個(gè)InetAddress對(duì)象奕坟。
InetAddress.getLocalHost();
//如果你知道一個(gè)數(shù)字地址祥款,可以由這個(gè)地址創(chuàng)建一個(gè)InetAddress對(duì)象,而不必使用InetAddress.getByAddress()與DNS交互月杉。
InetAddress.getByAddress();
信息獲取
//方法返回一個(gè)String刃跛,其中包含主機(jī)的名字,以及這個(gè)InetAddress對(duì)象表示的IP地址苛萎。只在不知道主機(jī)名時(shí)才會(huì)聯(lián)系DNS桨昙。
public String getHostName()
//知道主機(jī)名時(shí)也會(huì)聯(lián)系DNS检号,可能會(huì)替換原來(lái)緩存的主機(jī)名。
public String getCanonicalHostName()
//會(huì)以網(wǎng)絡(luò)字節(jié)順序?qū)P地址作為一個(gè)字節(jié)數(shù)返回蛙酪。Java沒(méi)有無(wú)符號(hào)字節(jié)這種基本數(shù)據(jù)類型齐苛,值大于127的字節(jié)會(huì)當(dāng)作負(fù)數(shù)。需要將字節(jié)提升我int桂塞,并做適當(dāng)?shù)恼{(diào)整凹蜂。
//之所以要查看IP地址的原始字節(jié),一個(gè)原因是想要確定地址的類型阁危,測(cè)試返回?cái)?shù)組的字節(jié)數(shù)可以確定處理的IPv4還是IPv6地址玛痊。
public byte[] getAddress()
//方法返回一個(gè)字符串,其中包含分四段格式的IP地址欲芹。
public String getHostAddress()
地址類型
- isAnylocalAdress()
如果是通配地址卿啡,方法返回true。通配地址可以匹配本地系統(tǒng)中的任何地址菱父,在IPv4中颈娜,通配地址是0.0.0.0。在IPv6中浙宜,通配地址是0:0:0:0:0:0:0:0官辽。
- isLoopbackAdress()
如果是回送地址,方法返回true粟瞬⊥停回送地址直接在IP層連接同一臺(tái)計(jì)算機(jī),而不使用任務(wù)物理硬件裙品。在IPv4中俗批,這個(gè)地址是127.0.0.1。在IPv6中市怎,這個(gè)回送地址是0:0:0:0:0:0:0:1岁忘。
- isLInkLocalAddress()
如果地址是一個(gè)IPv6本地鏈接地址,方法返回true区匠。
- isSiteLocalAddress()
如果地址是一個(gè)IPv6本地網(wǎng)絡(luò)地址干像,方法返回true。
- isMulticastAddress()
如果地址是一個(gè)組播地址驰弄,方法返回true麻汰。
- isMCGlobal()
如果地址是全球組播地址,方法返回true戚篙。
- isMCOrgLocal()
如果地址是一個(gè)組織范圍組播地址五鲫,方法返回true。
- isMCSiteLocal()
如果地址是一個(gè)網(wǎng)站范圍組播地址已球,方法返回true臣镣。
- isMCLinkLocal()
如果地址是一個(gè)子網(wǎng)范圍組播地址辅愿,方法返回true智亮。
- isMCNodeLocal()
如果地址是一個(gè)本地接口組播地址忆某,方法返回true。
以下是上面提到的所有的點(diǎn)的測(cè)試代碼集合
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws UnknownHostException {
showIntAddress(InetAddress.getByName("www.oreilly.com"));
showIntAddress(InetAddress.getByName("208.201.239.100"));
showIntAddress(InetAddress.getLocalHost());
showIntAddress(InetAddress.getByName("www.taobao.com"));
showIntAddress(InetAddress.getByName("183.136.135.225"));
showIntAddress(InetAddress.getByAddress(new byte[]{(byte)180,101,49,12}));
showIntAddress(InetAddress.getByAddress("www.baidu.com",new byte[]{(byte)180,101,49,12}));
}
public static void showIntAddress(InetAddress inetAddress){
System.out.println("inetAddress.getAddress() "+Arrays.toString(inetAddress.getAddress()));
System.out.println("inetAddress.getHostName() "+inetAddress.getHostName());
System.out.println("inetAddress.getHostAddress() "+inetAddress.getHostAddress());
System.out.println("inetAddress.getCanonicalHostName() "+inetAddress.getCanonicalHostName());
System.out.println("----");
System.out.println("inetAddress.isAnyLocalAddress() "+inetAddress.isAnyLocalAddress());//通配地址
System.out.println("inetAddress.isLoopbackAddress() "+inetAddress.isLoopbackAddress());//回送地址
System.out.println("inetAddress.isLinkLocalAddress() "+inetAddress.isLinkLocalAddress());//ip6的本地連接地址
System.out.println("inetAddress.isSiteLocalAddress() "+inetAddress.isSiteLocalAddress());//ip6的本地網(wǎng)站地址
System.out.println("inetAddress.isMulticastAddress() "+inetAddress.isMulticastAddress());//組播地址
System.out.println("inetAddress.isMCGlobal() "+inetAddress.isMCGlobal());//全球組播網(wǎng)址
System.out.println("inetAddress.isMCOrgLocal() "+inetAddress.isMCOrgLocal());//組織范圍組播網(wǎng)址
System.out.println("inetAddress.isMCSiteLocal() "+inetAddress.isMCSiteLocal());//網(wǎng)站范圍組播網(wǎng)址
System.out.println("inetAddress.isMCLinkLocal() "+inetAddress.isMCLinkLocal());//子網(wǎng)范圍內(nèi)組播網(wǎng)址
System.out.println("inetAddress.isMCNodeLocal() "+inetAddress.isMCNodeLocal());//本地接口組播地址
System.out.println("----------------------------");
}
}
測(cè)試可達(dá)性
InetAddress類有兩個(gè)isReachable()方法阔蛉,可以測(cè)試一個(gè)特定節(jié)點(diǎn)對(duì)當(dāng)前主機(jī)是否可達(dá)弃舒。
NetWorkInterface類
獲得實(shí)例
//表示有指定名字的網(wǎng)絡(luò)接口
NetWorkInterface.getName(String name)
//方法返回一個(gè)NetworkInterface對(duì)象,表示與指定IP地址綁定的網(wǎng)絡(luò)接口状原。
NetworkInterface.getByInetAddress(InetAddress address)
//方法返回一個(gè)枚舉聋呢,列出本地主機(jī)上的所有網(wǎng)絡(luò)接口。
NetworkInterface.getNetworkInterfaces()
//一個(gè)網(wǎng)絡(luò)接口可以綁定多個(gè)IP地址〉咔現(xiàn)在情況不太常見削锰,但確實(shí)是存在的。
NetworkInterface.getInetAddresses()
//返回某個(gè)特定NetworkInterface對(duì)象的名毕莱,如eth0或lo器贩。
NetworkInterface.getName()
//返回特定NetworkInterface的一個(gè)更友好的名字,如Ethernet Card 0朋截。
NetworkInterface.getDisplayName()