網(wǎng)絡(luò)編程

今日介紹內(nèi)容

1箫爷、網(wǎng)絡(luò)通信協(xié)議

2蛹含、UDP通信

3旱捧、TCP通信

第一章 網(wǎng)絡(luò)通信協(xié)議

? ? ? ? 通過計(jì)算機(jī)網(wǎng)絡(luò)可以使多臺計(jì)算機(jī)實(shí)現(xiàn)連接耘子,位于同一網(wǎng)絡(luò)中的計(jì)算機(jī)在進(jìn)行連接和通信時(shí)需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣她我。在計(jì)算機(jī)網(wǎng)絡(luò)中虹曙,這些連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議,它對數(shù)據(jù)的傳輸格式鸦难、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定员淫,通信雙方必須同時(shí)遵守才能完成數(shù)據(jù)交換合蔽。

? ? ? ? 網(wǎng)絡(luò)通信協(xié)議有很多種,目前應(yīng)用最廣泛的是TCP/IP協(xié)議(Transmission Control Protocal/Internet Protocol 傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議)介返,它是一個(gè)包括TCP協(xié)議和IP協(xié)議拴事,UDP(User Datagram Protocol)協(xié)議和其它一些協(xié)議的協(xié)議組,

? ? ? 在進(jìn)行數(shù)據(jù)傳輸時(shí)圣蝎,要求發(fā)送的數(shù)據(jù)和收到的數(shù)據(jù)完全一樣刃宵,這時(shí),就需要在原有的數(shù)據(jù)上添加很多信息徘公,以保證數(shù)據(jù)在傳輸過程中數(shù)據(jù)格式完全一致牲证。TCP/IP協(xié)議的層次結(jié)構(gòu)比較簡單,共分為四層关面,如圖所示:

TCP/IP協(xié)議組的層次結(jié)構(gòu)




? ? ? ?上圖中:TCP/IP協(xié)議中的四層分別是應(yīng)用層坦袍、傳輸層、網(wǎng)絡(luò)層和鏈路層等太,每層分別負(fù)責(zé)不同的通信功能捂齐。四層詳解如下:

鏈路層:鏈路層是用于定義物理傳輸通道,通常是對某些網(wǎng)絡(luò)連接設(shè)備的驅(qū)動協(xié)議缩抡,例如針對光纖奠宜、網(wǎng)絡(luò)提供的驅(qū)動。

網(wǎng)絡(luò)層:網(wǎng)絡(luò)層是整個(gè)TCP/IP協(xié)議的核心,它主要用于將傳輸?shù)臄?shù)據(jù)進(jìn)行分組压真,將分組數(shù)據(jù)發(fā)送到目標(biāo)計(jì)算機(jī)或者網(wǎng)絡(luò)娩嚼。

傳輸層:主要使網(wǎng)絡(luò)程序進(jìn)行通信,在進(jìn)行網(wǎng)絡(luò)通信時(shí)榴都,可以采用TCP協(xié)議待锈,也可以采用UDP協(xié)議。

應(yīng)用層:主要負(fù)責(zé)應(yīng)用程序的協(xié)議嘴高,例如HTTP協(xié)議竿音、FTP協(xié)議等。

1.1 ?IP地址和端口號

? ? ? ?要想使網(wǎng)絡(luò)中的計(jì)算機(jī)能夠通信拴驮,必須為每臺計(jì)算機(jī)指定一個(gè)標(biāo)識號春瞬,通過這個(gè)標(biāo)識號來指定接受數(shù)據(jù)的計(jì)算機(jī)或者發(fā)送數(shù)據(jù)的計(jì)算機(jī)。

? ? ? ?在TCP/IP協(xié)議中套啤,這個(gè)標(biāo)識號就是IP地址宽气,它可以唯一標(biāo)識一臺計(jì)算機(jī),目前潜沦,IP地址廣泛使用的版本是IPv4萄涯,它是由4個(gè)字節(jié)大小的二進(jìn)制數(shù)來表示,如:0000010100000000000000000000001由于二進(jìn)制形式表示的IP地址非常不便記憶和處理唆鸡,因此通常會將IP地址寫成十進(jìn)制的形式涝影,每個(gè)字節(jié)用一個(gè)十進(jìn)制數(shù)字(0-255)表示,數(shù)字間用符號“.”分開争占,如:“192.168.1.100”燃逻。

? ? ? 隨著計(jì)算機(jī)網(wǎng)絡(luò)規(guī)模的不斷擴(kuò)大,對IP地址的需求也越來越多臂痕,IPv4這種4個(gè)字節(jié)表示的IP地址面臨枯竭伯襟,因此IPv6便應(yīng)用而生了,IPv6使用16個(gè)字節(jié)表示IP地址握童,它所擁有的地址容量約十IPv4的8*10^28倍姆怪,(8乘以10的28次冪倍)達(dá)到2^128個(gè)(算上全零的),這樣就解決了網(wǎng)絡(luò)地址資源數(shù)量不夠的問題澡绩。

通過IP地址可以連接到指定計(jì)算機(jī)片效,但如果想訪問目標(biāo)計(jì)算機(jī)中的某個(gè)應(yīng)用程序,還需要指定端口號英古。在計(jì)算機(jī)中淀衣,不同的應(yīng)用程序是通過端口號區(qū)分的,端口號是用兩個(gè)字節(jié)(16位的二進(jìn)制數(shù))表示的召调,它的取值范圍是0~65535膨桥,其中蛮浑,0~1023之間的端口號用于一些知名的網(wǎng)絡(luò)服務(wù)和應(yīng)用,用戶的普通應(yīng)用程序需要使用1024以上的端口號只嚣,從而避免端口號被另外一個(gè)應(yīng)用或服務(wù)所占用沮稚。我們通過一個(gè)圖來描述IP地址和端口號的作用,如圖:

從上圖中可以清楚地看到册舞,位于網(wǎng)絡(luò)中一臺計(jì)算機(jī)可以通過IP地址去訪問另一臺計(jì)算機(jī)蕴掏,并通過端口號訪問目標(biāo)計(jì)算機(jī)中的某個(gè)應(yīng)用程序。

上述歸納如下:

IP地址 :(1)網(wǎng)絡(luò)中設(shè)備的標(biāo)識调鲸。(2)不易記憶盛杰,可用主機(jī)名 (3)本地回環(huán)地址:127.0.0.1 主機(jī)名:localhost ??

端口號:(1)用于識別進(jìn)程的邏輯地址,不同的進(jìn)程的標(biāo)識藐石。(2)有效端口:0~65535即供,其中0~1024系統(tǒng)使用或者保留端口。

傳輸協(xié)議:通訊的規(guī)則于微,常見協(xié)議:TCP UDP

1.2 InetAdderss

了解了IP地址的作用逗嫡,在java中,JDK提供了一個(gè)InetAdderss類株依,該類用于封裝一個(gè)IP地址驱证,并提供了一系列與IP地址相關(guān)的方法,如下表

其中恋腕,前兩個(gè)方法用于獲得該類的實(shí)例對象抹锄,第一個(gè)方法用于獲得表示指定主機(jī)的InterAddress對象,第二個(gè)方法用于獲得表示本地的InteAddress對象吗坚,通過InetAddress對象便可獲取指定主機(jī)名祈远,IP地址等呆万,案例演示如下:

第二章 UDP與TCP協(xié)議

? ? ? ? ?在介紹TCP/IP結(jié)構(gòu)時(shí) ?,提到傳輸層的兩個(gè)重要的高級協(xié)議谋减,分別是UDP和TCP牡彻,其中UDP是User Datagram Protocol 的簡稱,稱為用戶數(shù)據(jù)報(bào)協(xié)議出爹,TCP是Transmission Control Protocol 的簡稱庄吼,稱為傳輸控制協(xié)議。

? ? ? ? UDP是無連接通信協(xié)議严就,即在數(shù)據(jù)傳輸時(shí)总寻,數(shù)據(jù)的發(fā)送端盒接收端不建立邏輯連接。簡單來說梢为,當(dāng)一臺計(jì)算機(jī)向另一臺計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí)渐行,發(fā)送端不會確認(rèn)接收端是否存在轰坊,就會發(fā)送數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時(shí)祟印,也不會向發(fā)送端反饋是否收到數(shù)據(jù)肴沫。

由于使用UDP協(xié)議消耗資源小,通信效率高蕴忆,所以通常都會用于音頻和普通數(shù)據(jù)的傳輸颤芬,例如視頻會議都是用UDP協(xié)議,因?yàn)檫@種情況即使偶爾丟失一兩個(gè)數(shù)據(jù)包套鹅,也不會對接收結(jié)果產(chǎn)生太大影響站蝠。

但時(shí)在使用UDP協(xié)議傳送數(shù)據(jù)時(shí),由于UDP的面向無連接性芋哭,不能保證數(shù)據(jù)的完整性沉衣,因此在傳輸重要數(shù)據(jù)時(shí)不建議使用UDP協(xié)議,UDP的交換過程如下圖所示

以上歸納:(1)將數(shù)據(jù)及源和目的封裝成數(shù)據(jù)包减牺,不需要建立連接豌习。(2)每個(gè)數(shù)據(jù)報(bào)的大小限制在64K內(nèi)(3)因無連接,是不可靠協(xié)議 (4)不需要建立連接拔疚,速度快

2.1.1 DatagramPacket

前面介紹了UDP是一種面向無連接的協(xié)議肥隆,因此,在通信時(shí)發(fā)送端和接收端不用建立連接稚失。UDP通信的過程就像貨運(yùn)公司在兩個(gè)碼頭間發(fā)送貨物一樣栋艳,在碼頭發(fā)送和接收貨物時(shí)都需要使用集裝箱來裝卸貨物,UDP通信也是一樣句各,發(fā)送和接收的數(shù)據(jù)也需要使用“集裝箱”進(jìn)行打包吸占,為此JDK中提供了一個(gè)DatagramPacket類,該類的實(shí)例對象相當(dāng)于一個(gè)集裝箱凿宾,用于封裝UDP通信中發(fā)送或者接收的數(shù)據(jù)矾屯。

想要創(chuàng)建一個(gè)DatagramPacket對象,首先需要了解一下它的構(gòu)造方法初厚。在創(chuàng)建發(fā)送端和接收端的DatagramPacket對象時(shí)件蚕,使用的構(gòu)造方法有所不同,接收端的構(gòu)造方法只需要接收一個(gè)字節(jié)數(shù)組來存放接收到的數(shù)據(jù)产禾,而發(fā)送端的構(gòu)造方法不但要接收存放了發(fā)送數(shù)據(jù)的字節(jié)數(shù)組排作,還需要指定發(fā)送端IP地址和端口號。通過API文檔進(jìn)行詳細(xì)了解

2.1.2 DatagramSocket

DatagramPacket數(shù)據(jù)包的作用就如同是“集裝箱”亚情,可以將發(fā)送端或者接收端的數(shù)據(jù)封裝起來妄痪。然而運(yùn)輸貨物只有“集裝箱 ”是不夠的,還需要有碼頭楞件。在程序中國年需要實(shí)現(xiàn)通信只有DatagramPacket數(shù)據(jù)包也同樣不行衫生,為此JDK中提供的一個(gè)DatagramSocket類僧著。DatagramSocket類的作用就類似于碼頭,使用這個(gè)類的實(shí)例對象就可以發(fā)送和接收DatagramPacket數(shù)據(jù)包障簿,發(fā)送數(shù)據(jù)的過程如下圖所示:

2.1.3 網(wǎng)絡(luò)程序

講解了DatagramPacket和DatagramSocket的作用盹愚,接下來通過案例來學(xué)習(xí)在程序中的具體用法。下圖是UDP發(fā)送端與接收端交互圖解:

要實(shí)現(xiàn)UDP通信需要創(chuàng)建一個(gè)發(fā)送端程序和一個(gè)接收端程序站故,很明顯皆怕,在通信時(shí)只有接受收端程序先運(yùn)行,才能避免因發(fā)送端發(fā)送的數(shù)據(jù)無法接受西篓,而造成數(shù)據(jù)丟失愈腾,因此,首先需要來完成接受端程序的編寫岂津。

UDP完成數(shù)據(jù)的發(fā)送:發(fā)送端



2.2 TCP協(xié)議

TCP協(xié)虱黄,議是面向連接的通信協(xié)議,即在傳輸數(shù)據(jù)前先在發(fā)送端和接收端建立邏輯連接吮成,然后再傳輸數(shù)據(jù)橱乱,它提供了兩臺計(jì)算機(jī)之間可靠無差錯的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務(wù)器端粱甫,由客戶端向服務(wù)器發(fā)出連接請求泳叠,每次連接的創(chuàng)建都需要經(jīng)過“三次握手”。第一次握手:客戶端向服務(wù)器發(fā)出連接請求茶宵,等待服務(wù)器確認(rèn)危纫,第二次握手,服務(wù)器向客戶端回送一個(gè)響應(yīng)乌庶,通知客戶端收到了連接請求种蝶,第三次握手,客戶端再次向服務(wù)器端發(fā)送確認(rèn)信息瞒大,確認(rèn)連接螃征,整個(gè)交互過程如下圖:

由于TCP協(xié)議的面向連接特性,它可以保證傳輸數(shù)據(jù)的安全性糠赦,所以是一個(gè)被廣泛采用的協(xié)議会傲,例如在下載文件時(shí)锅棕,如果數(shù)據(jù)接收不完整拙泽,將會導(dǎo)致文件數(shù)據(jù)丟失而不能被打開,因此裸燎,下載文件時(shí)必須采用TCP協(xié)議顾瞻。

以上歸納:(1)建立連接,形成傳輸數(shù)據(jù)的通道德绿。(2)在連接中進(jìn)行大數(shù)據(jù)量傳輸 (3)通過三次握手完成連接荷荤,是可靠協(xié)議 (4)必須建立連接退渗,效率會稍低

2.2.2 TCP通信

TCP通信同UDP通信一樣,都能實(shí)現(xiàn)兩臺計(jì)算機(jī)之間的通信蕴纳,通信的兩端都需要創(chuàng)建socket對象会油。區(qū)別在于,UDP中只有發(fā)送端和接收端古毛,不區(qū)分客戶端與服務(wù)器端翻翩,計(jì)算機(jī)之間可以任意地發(fā)送數(shù)據(jù)。

而TCP通信是嚴(yán)格區(qū)分客戶端與服務(wù)器端的稻薇,在通信時(shí)嫂冻,必須先由客戶端去連接服務(wù)器端才能實(shí)現(xiàn)通信,服務(wù)器端不可以主動連接客戶端塞椎,并且服務(wù)器端程序需要事先啟動桨仿,等待客戶端的連接。

在java中案狠,JDK中提供了兩個(gè)類用于實(shí)現(xiàn)TCP程序服傍,一個(gè)是ServerSocket類,用于表示服務(wù)器端骂铁,就一個(gè)是Socket類伴嗡,用于表示客戶端。

通信時(shí)从铲,首先創(chuàng)建代表服務(wù)器端的ServerSocket對象瘪校,該對象相當(dāng)于開啟了一個(gè)服務(wù),并等待客戶端的連接名段,然后創(chuàng)建代表客戶端的Socket對象向服務(wù)器端發(fā)出連接的請求阱扬,服務(wù)器端響應(yīng)請求,兩者建立連接開始通信伸辟。

2.2.3簡單的TCP網(wǎng)絡(luò)程序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末麻惶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子信夫,更是在濱河造成了極大的恐慌窃蹋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件静稻,死亡現(xiàn)場離奇詭異警没,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)振湾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門杀迹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人押搪,你說我怎么就攤上這事树酪∏衬耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵续语,是天一觀的道長垂谢。 經(jīng)常有香客問我,道長疮茄,這世上最難降的妖魔是什么埂陆? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮娃豹,結(jié)果婚禮上焚虱,老公的妹妹穿的比我還像新娘。我一直安慰自己懂版,他們只是感情好鹃栽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躯畴,像睡著了一般民鼓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓬抄,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天丰嘉,我揣著相機(jī)與錄音,去河邊找鬼嚷缭。 笑死饮亏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阅爽。 我是一名探鬼主播路幸,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼付翁!你這毒婦竟也來了简肴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤百侧,失蹤者是張志新(化名)和其女友劉穎砰识,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佣渴,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辫狼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了观话。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片予借。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡越平,死狀恐怖频蛔,靈堂內(nèi)的尸體忽然破棺而出灵迫,到底是詐尸還是另有隱情,我是刑警寧澤晦溪,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布瀑粥,位于F島的核電站,受9級特大地震影響三圆,放射性物質(zhì)發(fā)生泄漏狞换。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一舟肉、第九天 我趴在偏房一處隱蔽的房頂上張望修噪。 院中可真熱鬧,春花似錦路媚、人聲如沸黄琼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脏款。三九已至,卻和暖如春裤园,著一層夾襖步出監(jiān)牢的瞬間撤师,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工拧揽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剃盾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓淤袜,卻偏偏與公主長得像万俗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子饮怯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 網(wǎng)絡(luò)編程概述 1.1 計(jì)算機(jī)網(wǎng)絡(luò) 是指將地理位置不同的具有獨(dú)立功能的多臺計(jì)算機(jī)及其外部設(shè)備闰歪,通過通信線路連接...
    JackChen1024閱讀 1,037評論 0 3
  • iOS網(wǎng)絡(luò)HTTP、TCP蓖墅、UDP库倘、Socket 知識總結(jié)OSI 七層模型我們一般使用的網(wǎng)絡(luò)數(shù)據(jù)傳輸由下而上共有七...
    蝸牛也有夢想閱讀 2,406評論 0 3
  • 引言 網(wǎng)絡(luò)學(xué)習(xí)的核心內(nèi)容就是網(wǎng)絡(luò)協(xié)議的學(xué)習(xí) 網(wǎng)絡(luò)協(xié)議:網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)交換而建立的規(guī)則、標(biāo)準(zhǔn)或者說是約定的集合因?yàn)椴?..
    _涼風(fēng)_閱讀 1,999評論 8 22
  • 前幾天在培訓(xùn)班决侈,情感咨詢師說降淮,每段感情都需要彼此相互陪伴阶淘、好好經(jīng)營,不能總是某一方在付出睬愤。 隨后淆九,問班上的女生們,...
    愛晚睡閱讀 1,432評論 0 5
  • 現(xiàn)在閉上眼睛回想一下配猫,今天從家里出來幅恋,到進(jìn)入公司你一共看到了多少廣告(手機(jī)、地鐵泵肄、電梯捆交、站臺、樓宇)腐巢,是不是感覺看...
    商務(wù)拓展閱讀 666評論 0 0