Netty源碼解析之 java網(wǎng)絡(luò)編程篇(1)

簡(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)的解釋

  1. Internet地址
  2. URL
  3. HTTP相關(guān)概念
  4. 模擬請(qǐng)求
  5. socket編程(簡(jiǎn)單的bio編程)
  6. 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() 

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛹稍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子部服,更是在濱河造成了極大的恐慌唆姐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廓八,死亡現(xiàn)場(chǎng)離奇詭異奉芦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剧蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門声功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人国夜,你說(shuō)我怎么就攤上這事减噪。” “怎么了车吹?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵筹裕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我窄驹,道長(zhǎng)朝卒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任乐埠,我火速辦了婚禮抗斤,結(jié)果婚禮上囚企,老公的妹妹穿的比我還像新娘。我一直安慰自己瑞眼,他們只是感情好龙宏,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伤疙,像睡著了一般银酗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徒像,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天黍特,我揣著相機(jī)與錄音,去河邊找鬼锯蛀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旁涤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拭抬,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼造虎!你這毒婦竟也來(lái)了傅蹂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤算凿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后氓轰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡署鸡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年案糙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靴庆。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炉抒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焰薄,我是刑警寧澤扒袖,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布亩码,位于F島的核電站季率,受9級(jí)特大地震影響蟀伸,放射性物質(zhì)發(fā)生泄漏蚀同。R本人自食惡果不足惜啊掏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一衰猛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啡省,春花似錦、人聲如沸卦睹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)徐鹤。三九已至垃环,卻和暖如春返敬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背劲赠。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凛澎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓预厌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親轧叽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刊棕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361