安卓基于TCP\UDP 協(xié)議通訊

前言:如果覺得太長(zhǎng)可以直接看實(shí)例地熄,個(gè)人覺得協(xié)議就是一些人根據(jù)某些需求而共同達(dá)成的約定躏惋。

TCP(Transport Control Protocol)

面向連接的能夠提供可靠的流式數(shù)據(jù)傳輸?shù)膮f(xié)議校仑。類似于打電話的過程拙徽。
(URL彪标、URLConnection概而、Socket呼巷、ServerSocket等類都使用TCP協(xié)議進(jìn)行網(wǎng)絡(luò)通訊)

TCP通訊原理圖.png

TCP三次握手

所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個(gè)TCP連接時(shí)赎瑰,需要客戶端和服務(wù)端總共發(fā)送3個(gè)包以確認(rèn)連接的建立王悍。在socket編程中,這一過程由客戶端執(zhí)行connect來觸發(fā)餐曼,整個(gè)流程如下圖所示:

  • 第一次握手:Client將標(biāo)志位SYN置為1压储,隨機(jī)產(chǎn)生一個(gè)值seq=J,并將該數(shù)據(jù)包發(fā)送給Server源譬,Client進(jìn)入SYN_SENT狀態(tài)集惋,等待Server確認(rèn)。
  • 第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請(qǐng)求建立連接踩娘,Server將標(biāo)志位SYN和ACK都置為1刮刑,ack=J+1,隨機(jī)產(chǎn)生一個(gè)值seq=K养渴,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求雷绢,Server進(jìn)入SYN_RCVD狀態(tài)。
  • 第三次握手:Client收到確認(rèn)后理卑,檢查ack是否為J+1翘紊,ACK是否為1,如果正確則將標(biāo)志位ACK置為1藐唠,ack=K+1帆疟,并將該數(shù)據(jù)包發(fā)送給Server孵滞,Server檢查ack是否為K+1,ACK是否為1鸯匹,如果正確則連接建立成功坊饶,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手殴蓬,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了匿级。

TCP四次握手(其實(shí)就是斷開TCP連接)

由于TCP連接時(shí)全雙工的,因此染厅,每個(gè)方向都必須要單獨(dú)進(jìn)行關(guān)閉痘绎,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個(gè)FIN來終止這一方向的連接肖粮,收到一個(gè)FIN只是意味著這一方向上沒有數(shù)據(jù)流動(dòng)了孤页,即不會(huì)再收到數(shù)據(jù)了,但是在這個(gè)TCP連接上仍然能夠發(fā)送數(shù)據(jù)涩馆,直到這一方向也發(fā)送了FIN行施。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方則執(zhí)行被動(dòng)關(guān)閉魂那。

  • 第一次揮手:Client發(fā)送一個(gè)FIN蛾号,用來關(guān)閉Client到Server的數(shù)據(jù)傳送,Client進(jìn)入FIN_WAIT_1狀態(tài)涯雅。
  • 第二次揮手:Server收到FIN后鲜结,發(fā)送一個(gè)ACK給Client,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同活逆,一個(gè)FIN占用一個(gè)序號(hào))精刷,Server進(jìn)入CLOSE_WAIT狀態(tài)。
  • 第三次揮手:Server發(fā)送一個(gè)FIN蔗候,用來關(guān)閉Server到Client的數(shù)據(jù)傳送鳄炉,Server進(jìn)入LAST_ACK狀態(tài)惯疙。
  • 第四次揮手:Client收到FIN后,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server阱持,確認(rèn)序號(hào)為收到序號(hào)+1赴叹,Server進(jìn)入CLOSED狀態(tài)乱顾,完成四次揮手乍钻。

UDP(User Datagram Protocol)

非面向連接的提供不可靠的數(shù)據(jù)包式的數(shù)據(jù)傳輸協(xié)議。類似于從郵局發(fā)郵件庆寺。
(DatagramPacket蚊夫、DatagramSocket、MulticastSocket等類使用UDP協(xié)議進(jìn)行網(wǎng)絡(luò)通訊)

比較:

TCP有建立時(shí)間
UDP傳輸有大小限制:64k以內(nèi)
TCP的應(yīng)用:Telnet(遠(yuǎn)程登錄)懦尝、ftp(文件傳輸)
UDP的應(yīng)用:ping命令

實(shí)例:

TCP通訊
//創(chuàng)建socket
Socket socket = new Socket("127.8.0.1",8080);

//創(chuàng)建輸出流
PrintWriter os =new PrintWriter(socket.getOutputStream());
//創(chuàng)建輸入流
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
.....以下部分變成流的讀寫操作了......
......總結(jié)起來知纷,建立連接之后其實(shí)變成了 I/O讀寫操作......

//###完成通訊之后關(guān)閉流###
// 關(guān)閉輸出流
 os.close();
//關(guān)閉輸入流
 is.close();
 socket.close(); 
UDP通訊
###接收數(shù)據(jù)###
 DatagramSocket  socket =new DatagramSocket();
DatagramPacket packet =new DatagramPacket(buf,256);

buf:數(shù)據(jù)接收的對(duì)象 如:byte[] buf =new byte[256]; 
256:字節(jié)長(zhǎng)度

用packet接收數(shù)據(jù)
socket.receive(packet);
//把數(shù)據(jù)轉(zhuǎn)字符串
String received =new String(packet.getData());

###發(fā)數(shù)據(jù)###
DatagramPacket packet =new DatagramPacket(buf,buf.length,address,port);
buf:數(shù)據(jù)發(fā)送的對(duì)象     如:byte[] buf =new byte[256]; 
buf.length:數(shù)據(jù)字節(jié)長(zhǎng)度 
address:發(fā)送的地址(比如:www.baidu.com或者192.168.9.2)
如:
InetAddress address = InetAddress.getByName("192.168.9.2");
port:端口號(hào)(如8080等)

發(fā)送packet數(shù)據(jù)
socket.send(packet);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壤圃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子琅轧,更是在濱河造成了極大的恐慌伍绳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乍桂,死亡現(xiàn)場(chǎng)離奇詭異冲杀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睹酌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門权谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人憋沿,你說我怎么就攤上這事旺芽。” “怎么了辐啄?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵采章,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我则披,道長(zhǎng)共缕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任士复,我火速辦了婚禮,結(jié)果婚禮上翩活,老公的妹妹穿的比我還像新娘阱洪。我一直安慰自己,他們只是感情好菠镇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布冗荸。 她就那樣靜靜地躺著,像睡著了一般利耍。 火紅的嫁衣襯著肌膚如雪蚌本。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天隘梨,我揣著相機(jī)與錄音程癌,去河邊找鬼。 笑死轴猎,一個(gè)胖子當(dāng)著我的面吹牛嵌莉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捻脖,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼锐峭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼中鼠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沿癞,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤援雇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后椎扬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惫搏,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年盗舰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晶府。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钻趋,死狀恐怖川陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛮位,我是刑警寧澤较沪,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站失仁,受9級(jí)特大地震影響尸曼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萄焦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一控轿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拂封,春花似錦茬射、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至萧恕,卻和暖如春刚梭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背票唆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工朴读, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惰说。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓磨德,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子典挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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