一、 Socket通信的介紹
? ? Android與服務(wù)器通信有兩種方式:Http 或 Socket调榄。
? ? Http:請(qǐng)求-響應(yīng)方式恃慧,即在請(qǐng)求時(shí)建立連接通道,當(dāng)客戶端向服務(wù)器發(fā)送請(qǐng)求后添瓷,服務(wù)端才能向客戶端返回?cái)?shù)據(jù)梅屉。
? ? Socket:在雙方建立起連接后就可以直接進(jìn)行數(shù)據(jù)的傳輸,在連接時(shí)可實(shí)現(xiàn)信息的主動(dòng)推送鳞贷,而不需要每次由客戶端向服務(wù)器發(fā)送請(qǐng)求坯汤。
?1)什么是 Socket?? ?
????Socket提供了程序內(nèi)部與外界通訊的端口并為通信雙方提供了數(shù)據(jù)傳輸通道搀愧。
? ?2)Socket的分類惰聂?
? ? 不同協(xié)議中的 Socket是不同的,這里只討論 TCP/IP咱筛,在這協(xié)議中搓幌,Socket類型為 流套接字(streamsocket)和數(shù)據(jù)報(bào)套接字(datagramsocket)。
????Streamsocket將 TCP作為其端對(duì)端協(xié)議迅箩,提供了一個(gè)可信賴的字節(jié)流服務(wù)溉愁。
? ??Datagramsocket使用UDP協(xié)議,提供數(shù)據(jù)打包發(fā)送服務(wù)饲趋。
二拐揭、Socket基本通信類型
三、Socket基本實(shí)現(xiàn)原理
? ? 1)基于 TCP協(xié)議的 Socket
????服務(wù)器端首先聲明一個(gè)ServerSocket對(duì)象并且指定端口號(hào)奕塑,然后調(diào)用Serversocket的accept()方法接收客戶端的數(shù)據(jù)堂污。accept()方法在沒有數(shù)據(jù)進(jìn)行接收的處于堵塞狀態(tài)。(Socketsocket=serversocket.accept()),一旦接收到數(shù)據(jù)爵川,通過inputstream讀取接收的數(shù)據(jù)敷鸦。
? ??客戶端創(chuàng)建一個(gè)Socket對(duì)象,指定服務(wù)器端的ip地址和端口號(hào)(Socketsocket=newSocket("172.168.10.108",8080);),通過inputstream讀取數(shù)據(jù)寝贡,獲取服務(wù)器發(fā)出的數(shù)據(jù)(OutputStreamoutputstream=socket.getOutputStream())扒披,最后將要發(fā)送的數(shù)據(jù)寫入到outputstream即可進(jìn)行TCP協(xié)議的socket數(shù)據(jù)傳輸。
? ? 2)基于 UDP協(xié)議的數(shù)據(jù)傳輸
? ??服務(wù)器端首先創(chuàng)建一個(gè)DatagramSocket對(duì)象圃泡,并且指點(diǎn)監(jiān)聽的端口碟案。接下來(lái)創(chuàng)建一個(gè)空的DatagramSocket對(duì)象用于接收數(shù)據(jù)(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客戶端發(fā)送的數(shù)據(jù)颇蜡,receive()與serversocket的accepet()類似价说,在沒有數(shù)據(jù)進(jìn)行接收的處于堵塞狀態(tài)辆亏。
? ??客戶端也創(chuàng)建個(gè)DatagramSocket對(duì)象,并且指點(diǎn)監(jiān)聽的端口鳖目。接下來(lái)創(chuàng)建一個(gè)InetAddress對(duì)象扮叨,這個(gè)對(duì)象類似與一個(gè)網(wǎng)絡(luò)的發(fā)送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定義要發(fā)送的一個(gè)字符串,創(chuàng)建一個(gè)DatagramPacket對(duì)象领迈,并制定要講這個(gè)數(shù)據(jù)報(bào)包發(fā)送到網(wǎng)絡(luò)的那個(gè)地址以及端口號(hào)彻磁,最后使用DatagramSocket的對(duì)象的send()發(fā)送數(shù)據(jù)。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)
? ? 四狸捅、Android實(shí)現(xiàn) Socket簡(jiǎn)單通信
? ? 1)添加權(quán)限
? ? 2)使用 TCP協(xié)議通信
Android端實(shí)現(xiàn):
服務(wù)器端實(shí)現(xiàn):
? ??
? ? 3)使用 UDP協(xié)議通信
客戶端發(fā)送數(shù)據(jù)實(shí)現(xiàn):
客戶端接收服務(wù)器返回的數(shù)據(jù):
服務(wù)器接收客戶端實(shí)現(xiàn):
五衷蜓、總結(jié):
????使用UDP方式android端和服務(wù)器端接收可以看出,其實(shí)android端和服務(wù)器端的發(fā)送和接收大庭相徑尘喝,只要端口號(hào)正確了磁浇,相互通信就沒有問題,TCP使用的是流的方式發(fā)送朽褪,UDP是以包的形式發(fā)送置吓。
參考資料: