Android網路通訊解析

來源:互聯網
上載者:User

標籤:android   http   io   ar   os   使用   sp   java   for   

網路編程的目的就是直接戒間接地通過網路通訊協定不其他電腦進行通訊。網路編程中有兩個主要的問題,一個是如何準確的定位網路上一台戒多台指主機;另一個就是找到主機後如何可靠高效的進行資料轉送。目前使用最廣泛的網際網路協議是TCP/IP協議:在TCP/IP協議中IP層主要負責網路主機的定位,資料轉送的路由,由IP地址可以唯一地確定Internet上的一台主機。而TCP層則提供面嚮應用的可靠的戒非可靠的資料轉送機制,這是網路編程的主要對象,一般丌需要關心IP層是如何處理資料的。Android平台為網路通訊提供了豐富的API,除了對Java標準平台保留的java.net、javax.net、javax.net.ssl包之外,還添加了android.net、android.net.http包。此外,Android平台還將Apache旗下的Http通訊相關的org.apache.http包也納入到系統來。下面做介紹。1)java.net包中主要類/介面說明類/介面                           說明ServerSocket                表示用於等待用戶端已連線的服務方的通訊端Scoket                      提供一個用戶端的TCP通訊端DatagramSocket              實現一個用於發送和接收資料報德DUP通訊端DatagramPacket              資料包IntetAddress                表示IP地址UnkownHostException         位置主機異常HttpURLConnection           用於管理Http連結(RFC 2068)的資源連線管理員URL                         用於指定互連網上1個資源的位置資訊(RFC 1783)2)javax.net.ssl包中主要類/介面說明類/介面                          說明HttpsURLConnection          用於管理Https串連(RFC 2818)的資源連線管理員SSLSocket                   提供安全性通訊協定的通訊端SSLServerSocket             基於SSL、TLS等協議的安全服務通訊端SSLContext                  SSL上下文環境APITrustManagerFactory         信任管理器工廠KeyManagerFactory           密鑰管理器工廠org.apacke.http.impl.client包主要類/介面說明類/介面                          說明DefaultHttpClient           表示一個Http用戶端預設實現介面org.apacke.http.client.methods包中主要類/介面說明類/介面                          說明HttpGet /HttpPost/HttpPut/HttpHead 表示Http的各種方法org.apacke.http包中主要類/介面說明類/介面                          說明HttpResponse                一個Http響應StatusLine                  狀態行Header                      表示Http頭部欄位HeaderElement               Http頭部值中的一個元素NameValuesPair              封裝了屬性:值對的類HttpEntity                  一個可以同Http訊息進行接收或發送的實體關於這方面更多地內容:參考Android的SDK首先介紹通過Apache提供的http包工具進行Http通訊,分成兩種形式:GET和POST。Get和POST請求主要有幾種區別:1、Post請求可以向伺服器傳送資料,而且資料放在HTML HEADER內一起傳送到服務端URL地址,資料對使用者丌可見。而get是把參數資料隊列加到提交的URL中,值和表單內各個欄位一一對應,例如(http://sso.eoeandroid.com/sso.php?partner=tiangu)2、get 傳送的資料量較小,丌能大於2KB。post傳送的資料量較大,一般被預設為丌受限制。3、get安全性非常低,post安全性較高。1、首先加入許可權:2、建立HttpClient對象,並做逾時時間設定:HttpClienthttpClient= newDefaultHttpClient(); //建立HttpClient對象HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 3000); //設定連線逾時HttpConnectionParams.setSoTimeout(httpClient.getParams(), 3000); //設定資料讀取時間逾時ConnManagerParams.setTimeout(httpClient.getParams(), 3000); //設定從串連池中取連線逾時3、使用Get請求,並擷取HttpResponse響應:HttpGethttpget= newHttpGet(url); //擷取請求HttpResponseresponse = httpClient.execute(httpget); //執行請求,擷取響應結果if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //響應通過String result= EntityUtils.toString(response.getEntity(), "UTF-8");}//注意做異常處理4、使用Post請求,並擷取HttpResponse響應:HttpClienthttpClient= newDefaultHttpClient(); // 建立HttpClient對象HttpPosthttpPost= newHttpPost(url); // 建立HttpPost對象List params= newArrayList(); //使用NameValuePair來儲存要傳遞的Post參數params.add(newBasicNameValuePair("username", "hello")); //添加要傳遞的參數params.add(newBasicNameValuePair("password", "eoe"));try{HttpEntityentity = newUrlEncodedFormEntity(params, HTTP.UTF_8); // 設定字元集httpPost.setEntity(entity); // 設定參數實體HttpResponsehttpResp= httpClient.execute(httpPost); // 擷取HttpResponse執行個體if(httpResp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //響應通過String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");}else{//響應未通過}}catch{}然後介紹使用標準java介面進行Http通訊,分成兩種形式:GET和POST。1、其預設使用get請求:URL pathUrl= newURL(url); //建立一個URL對象HttpURLConnectionurlConnect= (HttpURLConnection) pathUrl.openConnection(); //開啟一個HttpURLConnection串連urlConnect.setConnectTimeout(3000); // 設定連線逾時時間urlConnect.connect();InputStreamReaderin = newInputStreamReader(urlConnect.getInputStream()); //得到讀取的內容BufferedReaderbuffer = newBufferedReader(in); //為輸出建立BufferedReaderString inputLine= null;while(((inputLine= buffer.readLine()) != null)) {//利用迴圈來讀取資料}2、使用post請求:String params= "username=" + URLEncoder.encode("hello", "UTF-8")+ "&password=" + URLEncoder.encode("eoe", "UTF-8");byte[] postData= params.getBytes();URL pathUrl= newURL(url); //建立一個URL對象HttpURLConnectionurlConnect= (HttpURLConnection) pathUrl.openConnection();urlConnect.setConnectTimeout(3000); // 設定連線逾時時間urlConnect.setDoOutput(true); //post請求必須設定允許輸出urlConnect.setUseCaches(false); //post請求丌能使用緩衝urlConnect.setRequestMethod("POST"); //設定post方式請求urlConnect.setInstanceFollowRedirects(true);urlConnect.setRequestProperty("Content-Type","application/x-www-form-urlencode");// 配置請求Content-TypeurlConnect.connect(); // 開始串連DataOutputStreamdos = newDataOutputStream(urlConnect.getOutputStream()); // 發送請求參數dos.write(postData);dos.flush();dos.close();if(urlConnect.getResponseCode() == 200) { //請求成功byte[] data = readInputStream(urlConnect.getInputStream());}Socket通常也稱做“通訊端”,是一種抽象層,應用程式通過它來發送和接收資料,就像應用程式開啟了一個檔案控制代碼,將資料讀寫到穩定的儲存空間上一樣。使用Socket可以將應用程式添加到網路中,並與處於同一網路中的其他應用程式進行通訊。一台電腦上的應用程式向socket寫入的資訊能夠被另一台電腦上的另一個應用程式讀取,反之依然。Socket主要有兩種操作方式:連線導向的(流Socket)和不需連線的(資料報Socket)。連線導向的Socket操作必須建立一個串連和一個呼叫,所有資料包的到達順序和發出順序一致,使用TCP協議,此時Socket必須在發送資料之前與目的地的Socket取得串連,效率不高,但是安全;不需連線的Socket操作,資料包到達順序和發出順序不保證一致。使用UDP協議,一個資料報是一個獨立的單元,它包含了這次投遞的所有資訊,快速,高效,但安全性不高。若資料的可靠性更重要的話推薦使用連線導向的操作。1、伺服器端:ServerSocketss=newServerSocket(8888); //建立一個ServerSocket對象,並讓這個ServerSocket在8888連接埠監聽while(true){Socket socket=ss.accept(); //調用ServerSocket的accept()方法,接受用戶端所發送的請求,如果用戶端沒有發送資料,那麼該線程就停滯丌繼續try{DataInputStreamin=newDataInputStream(socket.getInputStream());//接收用戶端資訊String readline=in.readUTF();System.out.println(readline);DataOutputStreamout=newDataOutputStream(socket.getOutputStream()); //向用戶端發送訊息out.writeUTF("link server success");out.flush();in.close(); //關閉流out.close();//關閉流socket.close();//關閉開啟的socket} catch{}}1、用戶端:socket = newSocket("192.168.0.37", 8888);// 建立Socket,其中ip地址為我的PC機器的地址,手機通過wifi上網和伺服器在一個網段DataOutputStreamout = newDataOutputStream(socket.getOutputStream()); // 向伺服器發送訊息out.writeUTF(sendMsg);out.flush();DataInputStreamin = newDataInputStream(socket.getInputStream()); // 接收來自伺服器的訊息String readMsg= in.readUTF();if(readMsg!= null) {text.setText(readMsg);}out.close();in.close();socket.close();建立服務端的步驟如下:1、指定連接埠執行個體化一個ServerSocket;2、調用ServerSocket的accept方法以在等待串連期間造成阻塞;3、擷取位於底層的Socket流以進行讀寫操作;4、將資料封裝成流;5、對Socket進行讀寫;6、關閉開啟的流。建立用戶端的步驟如下:1、通過IP地址和連接埠執行個體化Socket,請求串連伺服器;2、擷取Socket上的流以進行讀寫;3、把流封裝進輸入/輸出(比如:BufferedReader/PrintWriter戒者DataOutputStream/ DataInputStream等)的執行個體;4、對Socket進行讀寫;5、關閉開啟的流。

Android網路通訊解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.