? 學(xué)習(xí)任何東西怜庸,我們只要搞清楚其原理馏鹤,就會(huì)觸類(lèi)旁通。現(xiàn)在結(jié)和我所學(xué)款侵,我想總結(jié)一下客戶(hù)端到服務(wù)器端的通信過(guò)程末荐。只有明白了原理,我們才會(huì)明白當(dāng)我們程序開(kāi)發(fā)過(guò)程中錯(cuò)誤的問(wèn)題會(huì)出現(xiàn)在那新锈,才會(huì)更好的解決問(wèn)題甲脏。
我們首先要了解一個(gè)概念性的詞匯:Socket
? socket的英文原義是“孔”或“插座”。作為進(jìn)程通信機(jī)制妹笆,取后一種意思块请。通常也稱(chēng)作“套接字”,用于描述IP地址和端口拳缠,是一個(gè)通信鏈的句柄墩新。(其實(shí)就是兩個(gè)程序通信用的。)socket非常類(lèi)似于電話(huà)的插座脊凰。以一個(gè)電話(huà)網(wǎng)為例抖棘。電話(huà)的通話(huà)雙方相當(dāng)于相互通信的2個(gè)程序,電話(huà)號(hào)碼可以當(dāng)作是IP地址狸涌。任何用戶(hù)在通話(huà)之前切省,首先要占有一部電話(huà)機(jī),相當(dāng)于申請(qǐng)一個(gè)socket帕胆;同時(shí)要知道對(duì)方的號(hào)碼(IP地址)朝捆,相當(dāng)于對(duì)方有一個(gè)固定的socket。然后向?qū)Ψ綋芴?hào)呼叫懒豹,相當(dāng)于發(fā)出連接請(qǐng)求芙盘。對(duì)方假如在場(chǎng)并空閑,拿起電話(huà)話(huà)筒脸秽,雙方就可以正式通話(huà)儒老,相當(dāng)于連接成功。雙方通話(huà)的過(guò)程记餐,是一方向電話(huà)機(jī)發(fā)出信號(hào)和對(duì)方從電話(huà)機(jī)接收信號(hào)的過(guò)程驮樊,相當(dāng)于向socket發(fā)送數(shù)據(jù)和從socket接收數(shù)據(jù)。通話(huà)結(jié)束后片酝,一方掛起電話(huà)機(jī)相當(dāng)于關(guān)閉socket囚衔,撤消連接,通信完成雕沿。
以上通信是以?xún)蓚€(gè)人通話(huà)做為事例來(lái)在概的說(shuō)明了下通信练湿,但是現(xiàn)在假如通信中的一個(gè)人是外國(guó)人(說(shuō)英語(yǔ)),一個(gè)人是中國(guó)人(說(shuō)普通話(huà))审轮,他們倆相互通信的話(huà)肥哎,都不能聽(tīng)明白對(duì)方說(shuō)的是什么辽俗,那么他們的溝通就不能夠完成。但是如果我們給一個(gè)規(guī)定贤姆,給通話(huà)雙方榆苞,只能講普通話(huà),那么雙方溝通就沒(méi)有障礙了霞捡。這就引出來(lái)了通信協(xié)議。
有兩種類(lèi)型:(Tcp協(xié)議與Udp協(xié)議):
Tcp協(xié)議與Udp協(xié)議是在兩硬件設(shè)備上進(jìn)行通信傳輸?shù)囊环N數(shù)據(jù)語(yǔ)法薄疚。
– 流式Socket(STREAM):
??? 是一種面向連接的Socket碧信,針對(duì)于面向連接的TCP服務(wù)應(yīng)用,安全街夭,但是效率低砰碴;Tcp:是以流的形式來(lái)傳的。
– 數(shù)據(jù)報(bào)式Socket(DATAGRAM):
??? 是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發(fā)),但效率高.Udp:將數(shù)據(jù)包拆開(kāi)為若干份編號(hào)后來(lái)傳輸板丽。在傳輸?shù)倪^(guò)程中容易出現(xiàn)數(shù)據(jù)的丟失呈枉。但是傳輸速度要比TCP的快。
Socket的通信流程
Demo:
服務(wù)器端:
– 申請(qǐng)一個(gè)socket?(socketWatch)用來(lái)監(jiān)聽(tīng)的
– 綁定到一個(gè)IP地址和一個(gè)端口上
– 開(kāi)啟偵聽(tīng)埃碱,等待接授客戶(hù)端的連接
– 當(dāng)有連接時(shí)創(chuàng)建一個(gè)用于和連接進(jìn)來(lái)的客戶(hù)端進(jìn)行通信的socket(socketConnection)
– 即續(xù)監(jiān)聽(tīng),等侍下一個(gè)客戶(hù)的連接
客戶(hù)端:
– 申請(qǐng)一個(gè)socket(socketClient)
– 連接服務(wù)器(指明IP地址和端口號(hào))
通過(guò)以上流程圖我們可以看出猖辫,客戶(hù)端與服務(wù)器端之間的一個(gè)基本通信流程,概括一下Socket 一般應(yīng)用模式(客戶(hù)端和服務(wù)器端)的作用:
服務(wù)器端:最少有兩個(gè)socket,一個(gè)是服務(wù)端負(fù)責(zé)監(jiān)聽(tīng)客戶(hù)端發(fā)來(lái)連接請(qǐng)求,但不負(fù)責(zé)與請(qǐng)求的客戶(hù)端通信砚殿,另一個(gè)是每當(dāng)服務(wù)器端成功接收到客戶(hù)端時(shí)啃憎,但在服務(wù)器端創(chuàng)建一個(gè)用與請(qǐng)求的客戶(hù)端進(jìn)行通信的socket.
客戶(hù)端:指定要連接的服務(wù)器端地址和端口,通過(guò)創(chuàng)建一個(gè)socket對(duì)象來(lái)初始化一個(gè)到服務(wù)器端的TCP連接似炎。