 Android中基(ji)于TCP協議的網絡(luo)通信
							時間(jian):2018-09-27      來源:未知
							Android中基(ji)于TCP協議的網絡(luo)通信
							時間(jian):2018-09-27      來源:未知 
							一、Android網絡簡介
Android與(yu)服務器(qi)的通(tong)(tong)信方式主要有兩(liang)種(zhong),一種(zhong)是Http通(tong)(tong)信,另一種(zhong)是Socket通(tong)(tong)信。
HTTP通(tong)信:Android中內置HttpClient,這(zhe)樣可(ke)以發方便的(de)發送Http請求并(bing)獲(huo)取(qu)Http響應(ying),簡化了與網站之間(jian)的(de)交(jiao)互。
Socket通(tong)信:Android還支(zhi)持JDK本身(shen)的TCP、UDP網絡通信的API,可以(yi)(yi)使用Java中提(ti)供(gong)的ServerSocket、Socket類,來建立(li)(li)基于TCP/IP協(xie)議的網絡通信。(本章(zhang)主(zhu)要講解TCP協(xie)議編(bian)程的相(xiang)關內容)也(ye)可以(yi)(yi)使用DatagramSocket、Datagrampacket、MulticastSocket來建立(li)(li)基于UDP協(xie)議的網絡通信。
兩者的區別:兩(liang)者的(de)大差異在于,Http連(lian)接使(shi)用的(de)是(shi)“請求(qiu)—響應方式”,即在請求(qiu)時(shi)建立連(lian)接通道,當客戶(hu)端向(xiang)服務器(qi)發送(song)請求(qiu)后(hou),服務器(qi)端才能向(xiang)客戶(hu)端返回數據。而Socket通信則是(shi)在雙方建立起(qi)連(lian)接后(hou)就可(ke)以(yi)直接進行數據的(de)傳輸,在連(lian)接時(shi)可(ke)實現信息的(de)主動推送(song),而不需要每(mei)次由客戶(hu)端想(xiang)服務器(qi)發送(song)請求(qiu)。
本文(wen)引用地址://fsbing.cn/emb/Column/7502.html
二、TCP協議基礎
TCP/IP通信協議(yi)(yi)是(shi)一(yi)種可靠的(de)網絡(luo)協議(yi)(yi),它(ta)在通信的(de)兩(liang)端(duan)各建立一(yi)個Socket,從而在通信的(de)兩(liang)端(duan)形成網絡(luo)虛擬鏈路。Java使用(yong)Socket對象來代(dai)表兩(liang)端(duan)的(de)通信接口,并通過Socket產生IO流來進行通信。
IP協(xie)(xie)議是Internet上使(shi)用(yong)的一個關(guan)鍵協(xie)(xie)議,它的全稱是Internet Protocol,即Internet協(xie)(xie)議,通常(chang)簡(jian)稱IP協(xie)(xie)議。通過使(shi)用(yong)IP協(xie)(xie)議,使(shi)Internet成為(wei)一個允許連(lian)接不同(tong)(tong)類型的計算機和(he)不同(tong)(tong)操作系統的網絡。
要使(shi)(shi)兩(liang)臺計算(suan)機彼(bi)此之間進(jin)行通信,必須(xu)使(shi)(shi)兩(liang)臺計算(suan)機使(shi)(shi)用同一(yi)(yi)種“語言”,IP協(xie)議只保證計算(suan)機能發(fa)送(song)和接收分組數據。IP協(xie)議負責將消(xiao)息從一(yi)(yi)個(ge)主機傳送(song)到另一(yi)(yi)個(ge)主機,消(xiao)息在傳送(song)的過程中被分割成一(yi)(yi)個(ge)個(ge)小包。
TCP協議被稱(cheng)作一種端(duan)(duan)對端(duan)(duan)協議,這是因為它(ta)(ta)為兩臺(tai)計算機(ji)(ji)之間的(de)連(lian)接起了重要作用:當一臺(tai)計算機(ji)(ji)需(xu)要與另(ling)一臺(tai)遠程計算機(ji)(ji)連(lian)接時,TCP協議會讓它(ta)(ta)們建立一個連(lian)接:用于(yu)發送和接收數據的(de)虛擬鏈路(lu)。
通(tong)過這種重發機(ji)制,TCP協議向應用程序提供可(ke)靠地通(tong)信(xin)連接,使它能(neng)夠自動(dong)適應網上的(de)各種變化,即使在Internet暫時出現堵塞的(de)情(qing)況下,TCP也能(neng)夠保證(zheng)通(tong)信(xin)的(de)可(ke)靠。
雖然IP和TCP這兩(liang)個協(xie)(xie)議(yi)的(de)功能(neng)不盡相同,也可以分開單獨使用,但它們(men)是(shi)在(zai)同一時期作(zuo)為一個協(xie)(xie)議(yi)來設計(ji)的(de),并且在(zai)功能(neng)上(shang)也是(shi)互補的(de),只有(you)兩(liang)者結(jie)合,才能(neng)保證Internet在(zai)復雜的(de)環境下正常(chang)運行,凡(fan)是(shi)要(yao)連接(jie)到Internet的(de)計(ji)算機(ji),都必須同時安裝和使用這兩(liang)個協(xie)(xie)議(yi),因此(ci)在(zai)實際中常(chang)把這兩(liang)個協(xie)(xie)議(yi)統(tong)稱為TCP/IP協(xie)(xie)議(yi)。
三、如何使用ServerSocket創建TCP服務器端:
Java中(zhong)能接(jie)(jie)收其他通信實(shi)體連接(jie)(jie)請(qing)求(qiu)的(de)類是ServerSocket,ServerSocket對象用(yong)于(yu)監(jian)聽來自客(ke)戶(hu)端(duan)的(de)Socket連接(jie)(jie),若沒有連接(jie)(jie)則它將(jiang)一直處于(yu)等(deng)待狀(zhuang)態。其中(zhong)監(jian)聽來自客(ke)戶(hu)端(duan)請(qing)求(qiu)的(de)方(fang)(fang)法:Socket accept()。該方(fang)(fang)法若收到一個(ge)客(ke)戶(hu)端(duan)Socket的(de)連接(jie)(jie)請(qing)求(qiu),該方(fang)(fang)法將(jiang)返回一個(ge)與連接(jie)(jie)客(ke)戶(hu)端(duan)Socket對應的(de)Socket,否則將(jiang)阻塞等(deng)待。代(dai)碼(ma)如:
ServerSocket socket = new ServerSocket(21300);
While(true){
Socket s = socket.accept();
}
四、使用Socket進行通信
客戶端(duan)經常使用(yong)Socket來連接到指定服務器,Socket類提供構(gou)造(zao)器連接到指定遠程主機和遠程端(duan)口(kou)的構(gou)造(zao)器,如:
Socket socket = new Socket(“192.168.1.11”,8000);
創建(jian)完(wan)畢Socket之后(hou)就可(ke)以(yi)進行通(tong)信(xin)了。Socket提供了InputStream getInputStream()和(he)OutputStream getOutputStream兩個方法來獲取輸(shu)入流(liu)和(he)輸(shu)出流(liu)進行數據(ju)的讀寫操作。例如:
while(true){
Socket socket = serversocket.accept();
OutputStream os = socket.getOutputStream();
os.write(“你好,我是服務器(qi)”.getBytes(“utf-8”));
os.close();
socket.close();
}
此時,就(jiu)可以(yi)進行(xing)服務器與客戶端的讀(du)寫操作(zuo)了。但是考慮到(dao)簡單(dan)C/S聊天室(shi)應用的實(shi)現,只了解(jie)這個是不夠的,需要加(jia)上多線程的才能使代碼變得完善(shan)。

