Android网络通信的六种方式示例代码
生活随笔
收集整理的這篇文章主要介紹了
Android网络通信的六种方式示例代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
表1展示了Android SDK中的一些與網(wǎng)絡(luò)有關(guān)的API包名
表1. Android SDK 網(wǎng)絡(luò)包
包? ? ? ?? ?? ?? ?? ?? ?描述? ? ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???API Level
Java.net? ? ? ?? ?? ?? ?? ?? ???提供與聯(lián)網(wǎng)有關(guān)的類,包括流和數(shù)據(jù)包(datagram)sockets、Internet 協(xié)議和常見 HTTP 處理。該包是一個多功能網(wǎng)絡(luò)資源。有經(jīng)驗的 Java 開發(fā)人員可以立即使用這個熟悉的包創(chuàng)建應(yīng)用程序。? ? ? ? 1
java.io? ? ? ?? ?? ?? ?? ?? ???雖然沒有提供顯式的聯(lián)網(wǎng)功能,但是仍然非常重要。該包中的類由其他 Java 包中提供的 socket 和連接使用。它們還用于與本地文件(在與網(wǎng)絡(luò)進行交互時會經(jīng)常出現(xiàn))的交互? ? ? ? 1
java.nio? ? ? ?? ?? ?? ?? ?? ???包含表示特定數(shù)據(jù)類型的緩沖區(qū)的類。適合用于兩個基于 Java 語言的端點之間的通信。? ? ? ? 1
org.apache.*? ? ? ? 表示許多為 HTTP 通信提供精確控制和功能的包。可以將 Apache 視為流行的開源 Web 服務(wù)器。? ? ? ? 1
android.net? ? ? ? 除核心 java.net.* 類以外,包含額外的網(wǎng)絡(luò)訪問 socket。該包包括 URI 類,后者頻繁用于 Android 應(yīng)用程序開發(fā),而不僅僅是傳統(tǒng)的聯(lián)網(wǎng)方面。? ? ? ? 1
android.net.http? ? ? ? 包含處理 SSL 證書的類。? ? ? ? 1
android.net.wifi? ? ? ? 包含在 Android 平臺上管理有關(guān) WiFi(802.11 無線 Ethernet)所有方面的類。? ? ? ? 1
android.telephony.gsm? ? ? ? 包含用于管理和發(fā)送 SMS(文本)消息的類。一段時間后,可能會引入額外的包來來為非 GSM 網(wǎng)絡(luò)提供類似的功能,比如 CDMA 或 android.telephony.cdma 等網(wǎng)絡(luò)。? ? ? ? 1
Android.net.sip? ? ? ? 包含Andriod平臺上管理有關(guān)SIP協(xié)議如建立和回應(yīng)Voip的類? ? ? ? 9
Android.nfc? ? ? ? 包含所有用來管理近場通信相關(guān)的功能類? ? ? ? 9
在Android中幾種網(wǎng)絡(luò)編程的方式:
(1)針對TCP/IP的Socket、ServerSocket
(2)針對UDP的DatagramSocket、DatagramPackage。這里需要注意的是,考慮到Android設(shè)備通常是手持終端,IP都是隨著上網(wǎng)進行分配的。不是固定的。因此開發(fā)也是有一點與普通互聯(lián)網(wǎng)應(yīng)用有所差異的。
(3)針對直接URL的HttpURLConnection
(4)Google集成了Apache HTTP客戶端,可使用HTTP進行網(wǎng)絡(luò)編程。針對HTTP,Google集成了Appache Http core和httpclient 4版本,因此特別注意Android不支持httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar?
(5)使用Web Service。Android可以通過開源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去實現(xiàn)Webservice?
??(6) 直接使用WebView視圖組件顯示網(wǎng)頁。基于WebView 進行開發(fā),Google已經(jīng)提供了一個基于chrome-lite的Web瀏覽器,直接就可以進行上網(wǎng)瀏覽網(wǎng)頁。
一、我們先來看第一種,針對TCP/IP Socket、ServerSocket的形式。
TCP/IP是一種協(xié)議,是一種面向連接的、可靠的協(xié)議。Socket僅僅是對TCP、UDP網(wǎng)絡(luò)接口的封裝,不涉及上層協(xié)議。TCP、UDP傳輸特性不同,分別適用于不同類型的應(yīng)用層協(xié)議,其中TCP有連接,延時較長,能保證服務(wù)質(zhì)量;UDP無連接,需要應(yīng)用程序進行數(shù)據(jù)分包、延時短,效率高,數(shù)據(jù)包可能丟失或到達對端發(fā)生順序混亂。在Socket之上可以實現(xiàn)這些RFC標準的應(yīng)用層協(xié)議,也可以自定義實現(xiàn)私有的應(yīng)用層協(xié)議。
在JAVA編程中, 經(jīng)常使用java.net和javax.net包來開發(fā)socket程序,下面列出所有常用的類,并簡單介紹。關(guān)于詳細的信息請參看JAVA文檔。
Java.net
Java.net.Socket? ? ? ?? ?? ?? ?? ?? ???客戶端連接使用的TCP socket
Java.net.DatagramSocket? ? ? ? 客戶端和服務(wù)端共同使用的UDP socket
Java.net.ServerSocket? ? ? ? 服務(wù)端TCP socket監(jiān)聽端口
Java.netInetAddress? ? ? ?? ?? ?? ?? ?? ???IP地址封裝類
Java.net.DataGramPacket? ? ? ? 通過DatagramSocket收發(fā)的數(shù)據(jù)包的封裝類,包括數(shù)據(jù)和對端的IP地址、UDP端口
Javax.net
Javax.net.SocketFactory? ? ? ?? ?? ?? ?? ?? ???客戶端連接使用的T CP socket
Javax.net.ServerSocketFactory? ? ? ? 服務(wù)端TCP socket監(jiān)聽端口
Javax.net.ssl.SSLSocketFactory? ? ? ? SSL客戶端Socket構(gòu)造器
Javax.net.ssl.SSLServerFactory? ? ? ? SSL服務(wù)端監(jiān)聽Socket構(gòu)造器
示例代碼: android+socket編程實例.rar
二、針對UDP的DatagramSocket、DatagramPackage
1.對于UDP服務(wù)端,首先啟動偵聽服務(wù),然后得到數(shù)據(jù)包進行處理,組后根據(jù)獲得數(shù)據(jù)包進行反饋。
2.UDP socket沒有連接的概念,因此構(gòu)造完成的DatagramSocket不會發(fā)出向?qū)Χ说木W(wǎng)絡(luò)連接請求,在每一個發(fā)送的UDP數(shù)據(jù)包中包含目的地址和端口。因為UDP數(shù)據(jù)不會在對端進行重新組包,因此一次發(fā)送的數(shù)據(jù)長度必須加以限制。Socket.send(outputPacket);用于發(fā)送一個數(shù)據(jù)包;socket.receive(inputPacket);用于接收一個數(shù)據(jù)包。
?
???
示例代碼:
服務(wù)器端:
public class UDPServer{
? ? ? ? ? ???public static void main(String[] args) throws Exception{
? ? ? ? ? ? ? ? ? ???DatagramSocket udpSocket = new DatagramSocket(8000);
? ? ? ? ? ? ? ? ? ???while(true){
? ? ? ? ? ? ? ? ? ? ? ? ? ???try{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???// UDP數(shù)據(jù)讀取
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???DatagramPacket packet = new DatagramPacket(new byte[512],512);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???udpSocket.receive(packet);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???String msg = new String(packet.getData()), 0,packet.getLength());
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???System.out.println(msg);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???if(msg.equals("exit")){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???// UDP數(shù)據(jù)發(fā)送
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???SimpleDateFormat f = new SimpleDateFormat("MMM dd,yyyy kk:mm:ss");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???String time = "現(xiàn)在的時間是:" + f.format(new Date());
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???packet.setData(time.getBytes());
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???udpSocket.send(packet);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ???}catch(Exception e){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???e.printStackTrace();
? ? ? ? ? ? ? ? ? ? ? ? ? ???}
? ? ? ? ? ? ? ? ? ???}
? ? ? ? ? ? ? ? ? ???udpSocket.close();
? ? ? ? ? ???}
? ???}
客戶端:
public void client(){
? ? ? ? ? ???InetAddress remoteIP;
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? remoteIP = InetAddress.getByName("localhost");
? ? ? ? ? ? ? ? ? ? ? ? DatagramSocket socket = new DatagramSocket();
? ? ? ? ? ? ? ? } catch (UnknownHostException e1) {?
? ? ? ? ? ? ? ? ? ? ? ? e1.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ???
? ? ? ? ? ???BufferedReader wt = new BufferedReader (new InputStreamReader(System.in));
? ? ? ? ? ???System.out.println("input one line ,user \"exit\" to quit the server ");?
? ? ? ? ? ???while(true){
? ? ? ? ? ? ? ? ? ???try{
? ? ? ? ? ? ? ? ? ? ? ? ? ???// 讀取輸入
? ? ? ? ? ? ? ? ? ? ? ? ? ???String str = wt.readLine();
? ? ? ? ? ? ? ? ? ? ? ? ? ???byte[] outputData = str.getBytes();
? ? ? ? ? ? ? ? ? ? ? ? ? ???// UDP socket 數(shù)據(jù)發(fā)送
? ? ? ? ? ? ? ? ? ? ? ? ? ???DatagramPacket outputPacket = new DatagramPacket(outputData,outputData.length,remoteIP,8000);
? ? ? ? ? ? ? ? ? ? ? ? ? ???socket.send(outputPacket);
? ? ? ? ? ? ? ? ? ? ? ? ? ???if(str.equals("exit")){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//udp 數(shù)據(jù)讀取
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???DatagramPacket inputPacket = new DatagramPacket(new byte[512],512);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???socket.receive(inputPacket);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???System.out.println(new String(inputPacket.getData(),0,inputPacket.getLength()));
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ???}
? ? ? ? ? ? ? ? ? ???}catch(Exception e){
? ? ? ? ? ? ? ? ? ? ? ? ? ???e.printStackTrace();
? ? ? ? ? ? ? ? ? ???}
? ? ? ? ? ???}
? ? ? ? ? ???socket.close();
? ???}
三、針對直接URL的HttpURLConnection
這個就是把請求的方式從HttpClient換成HttpURLConnection就可以了。沒什么可以說的,自己看看吧。
示例代碼:無
四、Google集成了Apache HTTP客戶端,可使用HTTP進行網(wǎng)絡(luò)編程
這個不多說了,網(wǎng)絡(luò)編程,必須會的。自己看代碼吧。服務(wù)端我使用三種方式:S2SH、只用Struts2、Servlet。客戶端就一種,只不過換個請求的URL。服務(wù)端和客戶端交互使用了兩種方式:XML、JSON,目前開放平臺返回的數(shù)據(jù)都是支持這兩種數(shù)據(jù)格式的。所以我也實現(xiàn)了這兩種數(shù)據(jù)格式。其實還有一種格式,就是google的protocal buffer,這種形式在國內(nèi)用的人比較少,我也沒弄,感興趣的同學(xué)看我提供的文檔,自己研究吧。注意把里面的IP換成自己電腦的IP地址。
示例代碼:
服務(wù)端:ServletTest1.rar、StrAnd.rar、WebAndroid.rar
客戶端:WebAndroidClient.rar
參考網(wǎng)址:
http://www.cnblogs.com/zhangdong ... /04/19/2020688.html
http://blog.csdn.net/woshisap/article/details/6621571
http://www.360doc.com/content/11/0521/01/4154133_118259561.shtml
注意:在只使用Struts2的服務(wù)器端,可以這么配置:
<package name="struts-main" extends="json-default" >? ?
? ?? ?<action name="*UserAction" class="userAction" method="{1}">
? ?? ?? ?<result type="json"></result>
? ?? ?</action>
??</package>
也可以這么配置:
<package name="struts-main" extends="struts-default" >? ?
? ?? ?<action name="*UserAction" class="userAction" method="{1}">
? ?? ?? ? <result name="register">/WEB-INF/page/register.jsp</result>
? ?? ?? ? <result name="save">/WEB-INF/page/index.jsp</result>? ? ? ??
? ?? ?</action>
??</package>
? ?? ? 但是其實返回數(shù)據(jù)的時候都是封裝JSON字符串,沒用到第一種形式的配置的功能。據(jù)說,用第一種配置方式,struts2可以自動把返回的數(shù)據(jù)封裝成JSON字符串的形式,但是我沒測試成功。。。。我返現(xiàn)返回什么格式還是什么格式,并沒有把數(shù)據(jù)自動封裝成JSON返回。
? ? 在使用S2SH的服務(wù)端,就不能用第一種方式配置。只能用第二種方式,然后服務(wù)端封裝JSON返回客戶端。如果用第一種方式配置,就會發(fā)生404錯誤。無法找到服務(wù)器端。
? ? 在使用Servlet的服務(wù)端,可以通過下面這種方式設(shè)置返回類型,但是其實沒用,你設(shè)置了,它也不返回。你只能自己封裝XML文件或者JSON字符串,然后返回。
response.setContentType("application/json;charset=utf-8");
(5)使用Web Service
我之前只聽說過什么事webservice,因此主要是參考下面文章實現(xiàn)的DEMO,他給出了一些實例代碼,不全,我給基本補全了。顯示天氣信息我都在LOG輸出了,沒有顯示在界面上,如果大家覺得不爽,可以把信息直接顯示在界面上就可以了。因為我被這個問題困擾了2天,弄的很崩潰,所以就沒繼續(xù)弄。大家自己看吧。
那么什么是webService呢?,它是一種基于SAOP協(xié)議的遠程調(diào)用標準,通過webservice可以將不同操作系統(tǒng)平臺,不同語言,不同技術(shù)整合到一起。在Android中,第三方公司提供了基于webservice的jar包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
http://www.cnblogs.com/zhangdong ... /04/19/2020688.html
http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html
示例代碼:SoapAndroidTeset.rar、sserEx09.rar
(6) 直接使用WebView視圖組件顯示網(wǎng)頁
這就是使用webview顯示網(wǎng)頁的問題,比較容易,大家自己看吧。我就不貼實例代碼了。
示例代碼:
?WebAndroidClient.rar??
?WebAndroid.rar??
?StrAnd.rar??
?sserEx09.rar??
?SoapAndroidTeset.rar??
?ServletTest1.rar??
?android socket編程實例.rar??
轉(zhuǎn)載于:https://www.cnblogs.com/phonegap/archive/2012/06/04/2536043.html
總結(jié)
以上是生活随笔為你收集整理的Android网络通信的六种方式示例代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两天低效编程总结
- 下一篇: Android一些知识总结