android 三種網路通訊介面及各個介面的程式碼示例
Android平臺瀏覽器採用了WeBKit引擎,這款名為Chorme Lite的Web瀏覽器擁有強大擴充套件特性,每個開發者都以為編寫自己的外掛,使得瀏覽器的功能更加完善。
目前Android平臺有3種網路介面。
第一種 java.net.*(標準java介面)
此介面提供與聯網有關的類,包括流和資料包套接字、Internet協議、常見HTTP處理。如:建立URL以及URLConnection/HttpURLConnection物件、設定連線引數、連線伺服器、向伺服器寫
資料、從伺服器讀取資料等通訊。
下例為常見java.net包的Http例子:
try{
URL url = new URL("定義地址
HttpURLConnection http = (HttpURLConnection) url.openConnection();//開啟連線
int nRC = http.getResponseCode();//得到連線狀態
if(nRC == HttpURLConnection.HTTP_OK){
InputStream is = http.getInputStream();//取得資料
.....//處理資料
}
}catch(Exception e){
//因是連線網路,不免會出現一些異常,所以必須處理這些異常
}
第二種 Apache介面
Android提供的Apache HttpClient,它是一個開源專案,功能更加完善,為客戶端的Http程式設計提供高效、最新、功能豐富的工具包。
Android目前使用的是HttpClient4.0(org.apache.http.*),可將Apache看為目前流行的開源Web伺服器,主要包括建立HttpClient以及Get/Post、HttpRequest等物件,設定連線引數,執行HTTP操作,
處理伺服器返回結果等功能。
下例為使用android.net.http.*包的例子:
try{
HttpClient hc = new DefaultHttpClient();//建立HttpClient,這裡使用DefaultHttpClient表示預設屬性
HttpGet hg = new HttpGet("例項
HttpResponse rp = hc.execute(hg);//連線
if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
InputStream is = rp.getEntity().getContent();
.....//處理資料
}
}catch(IOEeception e){
}
第三種 Android網路介面
android.net.*包實際是通過Apache中HttpClient的封裝來實現的一個HTTP程式設計介面,同時還提供了Http請求佇列管理以及Http連線池管理,以提高併發請求情況下(如裝載網頁時)的效率
還包括 網路狀態監視等介面,網路訪問的Socket,常用的Uri類以及有關WiFi相關的類等等。
下例為最簡單的Socket連線
try{
InetAddress ia = InetAddress.getByName("192.168.1.110");//IP地址
Socket sk = new Socket(inetAddress,61203,true);//埠
InputStream is =sk.getInputStream();//得到資料
OutputStream os = sk.getOutputStream();
.....//資料處理
os.close();
is.close();
sk.close();
}catch(UnknownHostException e){
}catch(IOException e){
}
第二部分 Http通訊
Android提供了HttpURLConnection和HttpClient介面來開發Http程式。
Http(Hyper Text Transfer Protocol,超文字傳輸協議)用於傳輸WWW方式的資料。
HTTP通訊中客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程為"一次連線"。要保證客戶端程式線上狀態,需要不斷地向
伺服器傳送連線請求。通常的做法是即使不需要獲得任何資料,客戶端也保持沒隔一段固定的時間向伺服器傳送一次“保持連線”的請求,伺服器在收到該請求後對客戶端進行回覆,表明
知道客戶端線上。若長時間無法收到客戶端的請求,則認為客戶端下線,若客戶端長時間無法收到伺服器的回覆,則認為網路已經斷開。很多情況下,需要伺服器端主動向客戶端傳送資料
以保持客戶端與伺服器資料的實時與同步。Http通訊中,伺服器需要等到客戶端傳送一次請求後才能將資料傳回給客戶端,因此,客戶端定時向伺服器端傳送連線請求,不僅可以保持線上,
同時也是在"詢問"伺服器是否有新資料,如果有就將資料傳給客戶端。
Http採用請求/響應的模式。客戶端向伺服器傳送一個請求,請求頭包含了請求方法,URI,協議版本,以及包含請求修飾符,客戶資訊和內容,類似於MIME訊息結構。伺服器以一個狀態行作
為響應,響應的內容包含訊息協議的版本,成功或錯誤編碼,還包含伺服器訊息,實體元資訊以及可能的實體內容。它是一個屬於應用層的面向物件的協議,適用於分散式超媒體資訊系統。
許多HTTP通訊是由一個使用者代理初始化的,並且包括一個申請在源伺服器上資源的請求。最簡單的情況可能是在使用者代理和伺服器之間通過一個單獨的連線來完成。
在Internet上,Http通訊通常發生在TCP/IP連線上,預設埠是TCP80.其他埠也是可用的。
第一種 HttpURLConnection介面
Http通訊中使用最多的是Get和Post.
Get請求可用獲得靜態頁面,也可以把引數放在URL字串的後面,傳遞給伺服器。
Post引數不是放在URL字串裡面,而是放在http請求資料中。
URLConnection與HttpURLConnection都是抽象類,無法直接例項化物件。其物件主要通過URL的openConnection方法獲得,但openConnection方法只是建立URLConnection或者HttpURLConnection
的例項,並不是進行真正的連線操作。因此在連線之前我們可用對一些屬性進行設定
對HttpConnection例項的屬性設定:
connection.setDoOutput(true);//設定輸出流
connection.setDoInput(true);//設定輸出流
connection.setRequestMethod("POST");//設定方式為POST
connection.setUseCaches(false);//Post請求不能使用快取
urlConn.disconnect();//連線完成之後關閉HttpURLConnection連線
首先在伺服器上建立一個不需要傳遞引數的網頁http1.jsp檔案。程式碼如下:
<HTML>
<HEAD>
<TITLE>
Http Test
</TITLE>
</HEAD>
<BODY>
<% out.println("<h1>HTTP TEST<br>http test</h1>"); %>
</BODY>
</HTML>
再建立一個適用Get和Post來傳遞引數的網頁httpget.jsp 程式碼如下:
<%@ page language="java" import = "java.util.*" pageEncoding = "gb2312" %>
<HTML>
<HEAD>
<TITLE>
Http Test
</TITLE>
</HEAD>
<BODY>
<%
String type = request.getParameter("par");
String result = new String(type.getBytes("iso-8859-1")),"gb2312");
out.println("<h1>parameters:"+result+"</h1>");
%>
</BODY>
</HTML>
以下例中通過Android程式分別以不同的方式訪問這兩個頁面。
main.xm 檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=""
androidrientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="通過下面的按鈕進行不同方式的連線"/>
<Button
android:id="@+id/Button_HTTP"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="直接獲取資料"/>
<Button
android:id="@+id/Button_Get"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="以GET方式傳遞資料"/>
<Button
android:id="@+id/Button_Post"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="以POST方式傳遞資料"/>
</LinearLayout>
http.xml檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""
androidrientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/TextView_HTTP"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/Button_Back"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="返回"/>
</LinearLayout>
public class Activity01 extends Activity{//進入介面實現3個控制元件的Activity
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button_http = (Button) findViewById(R.id.Button_HTTP);
/* 監聽button的事件資訊 */
button_http.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
/* 新建一個Intent物件 */
Intent intent = new Intent();
/* 指定intent要啟動的類 */
intent.setClass(Activity01.this, Activity02.class);
/* 啟動一個新的Activity */
startActivity(intent);
/* 關閉當前的Activity */
Activity01.this.finish();
}
});
Button button_Get = (Button) findViewById(R.id.Button_Get);
/* 監聽button的事件資訊 */
button_Get.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
/* 新建一個Intent物件 */
Intent intent = new Intent();
/* 指定intent要啟動的類 */
intent.setClass(Activity01.this, Activity03.class);
/* 啟動一個新的Activity */
startActivity(intent);
/* 關閉當前的Activity */
Activity01.this.finish();
}
});
Button button_Post = (Button) findViewById(R.id.Button_Post);
/* 監聽button的事件資訊 */
button_Post.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
/* 新建一個Intent物件 */
Intent intent = new Intent();
/* 指定intent要啟動的類 */
intent.setClass(Activity01.this, Activity04.class);
/* 啟動一個新的Activity */
startActivity(intent);
/* 關閉當前的Activity */
Activity01.this.finish();
}
});
}
}
public class Activity02 extends Activity{//直接獲取資料
private final String DEBUG_TAG = "Activity02";
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.http);
TextView mTextView = (TextView)this.findViewById(R.id.TextView_HTTP);
String httpUrl = "地址
String resultData = "";//獲得的資料
URL url = null;
相關推薦
android 三種網路通訊介面及各個介面的程式碼示例
第一部分 Android網路基礎 Android平臺瀏覽器採用了WeBKit引擎,這款名為Chorme Lite的Web瀏覽器擁有強大擴充套件特性,每個開發者都以為編寫自己的外掛,使得瀏覽器的功能更加完善。 目前Android平臺有3種網路介面。 第
面試篇--android下網路通訊機制(三種網路通訊方式)
HttpClient HttpClient是Apache對java中的HttpURLClient介面的封裝,主要引用org.apache.http.**。Google在2.3版本之前推薦使用HttpClient,因為這個封裝包安全性高,bug較少。 使用方法: impo
Android的三種網路通訊方式
Android平臺有三種網路介面可以使用,他們分別是:java.net.*(標準Java介面)、Org.apache介面和Android.net.*(Android網路介面)。下面分別介紹這些介面的功能和作用。 1.標準Java介面 java.net.*提供與聯網有關的類,
vmware三種網路模式介紹及nat模式下使用同一區域網的非宿主機ssh連線虛擬機器
1、vmware虛擬機器三種網路模式 開啟vmware虛擬機器,我們可以在選項欄的“編輯”下的“虛擬網路編輯器”中看到VMnet0(橋接模式)、VMnet1(僅主機模式)、VMnet8(NAT模式),那麼這些都是有什麼作用呢?其實,我們現在看到的VMnet0表示的是用於橋接
Linux三種網路訪問模式及常用命令大全
1 三種網路訪問方式 1:橋接模式,將虛擬機器當做一臺獨立的電腦 2:僅主機模式,虛擬機器可以訪問宿主機,宿主機不可以訪問虛擬機器,虛擬機器不能上網 3:NAT模式,虛擬機器可以連線宿主機並且通過宿主機上網,這個模式下,宿主機就相當於一臺路由器最多可以連線245臺虛擬機器 2 linux
Android三種動畫實現原理及使用
Android動畫目前分為三種:Frame Animation 幀動畫,通過順序播放一系列影象從而產生動畫效果,。圖片過多時容易造成OOM(Out Of Memory記憶體用完)異常。Tween Animation 補間動畫(又叫view動畫),是通過對場景裡的物件不斷做影象
VMWare/VirtualBox三種網路模式及NAT/host-only模式設定上網與主機互聯通訊
VMWare/VirtualBox中,提供了bridged(橋接模式)、NAT(網路地址轉換模式)和host-only(主機模式)三種網路模式。但有時候我們在搭建偽分散式的實驗中需要僅主機網絡卡虛擬機器能聯網,NAT網絡卡虛擬機器相互通訊,這時候三種網路的侷限性就凸顯
我來學網路——三種資料通訊方式
對於點對點之間的通訊,按照訊息傳送的方向與時間關係,通訊方式可分為單工通訊、半雙工通訊及全雙工通訊三種。 單工通訊只支援資料在一個方向上傳輸,又稱為單向通訊。如無線電廣播和電視廣播都是單工通訊。 半雙工通訊允許資料在兩個方向上傳輸,但在同一時刻,只允許資料在一個方向上傳輸,它實際上是一種可切
Android三種方式擷取任意介面螢幕
一、使用MediaProjectionManager Android5.0之後,開放擷取螢幕的API,也就是利用MediaProjectionManager建立VirtualDisplay,傳入與ImageReader關聯的Surface,這樣就可以從ImageReader
Android 三種常用實現自定義圓形進度條 ProgressBar 及demo
Android 自定義 進度條,一般有三種方式,最早一般使用UI給的圖片使用幀動畫,完成,後面兩種,一種是使用自定義顏色,另外一種是使用帶相近色的圖片加動畫完成。 下面具體 說一下三種方式,推薦使用第二種方式,如果這種達不到效果,或者比較高也可使用第一
VMWare linux 虛擬機器三種網路,及區別
前言虛擬機器網路模式無論是vmware,virtual box,virtual pc等虛擬機器軟體,一般來說,虛擬機器有三種網路模式:1.橋接2.NAT3.Host-Only初學者看到虛擬機器有三種網路,估計就慌了,筆者也是。哪一種網路是適合自己的虛擬機器呢?橋接
Android之三種網路請求解析資料
一:AsyncTask解析資料 AsyncTask主要用來更新UI執行緒,比較耗時的操作可以在AsyncTask中使用。 AsyncTask是個抽象類,使用時需要繼承這個類,然後呼叫execute()方法。注意繼承時需要設定三個泛型Params,P
瞭解虛擬機器三種網路模式及遠端工具(SSH)基本使用方法
虛擬機器網路模式:點選虛擬機器軟體的編輯選單,選擇虛擬網路編輯器,可以看到虛擬機器的三種網路的配置,如圖:①橋接模式:克隆宿機上的ip,在同一ip段內例如宿機上的ip:192.168.1.XXXLinux產生的ip:192.168.1.1~255中的任一一個,但是不能與宿機上
VMware虛擬機器三種網路模式的區別及配置方法
轉載:https://blog.csdn.net/Alpha_B612/article/details/80979101 本文參照文章: https://www.linuxidc.com/Linux/2016-09/135521.htm https://www.jb51.
VMware虛擬機器三種聯網方法及原理和Linux 三種網路
一、Brigde——橋接:預設使用VMnet0 1、原理: Bridge 橋"就是一個主機,這個機器擁有兩塊網絡卡,分別處於兩個區域網中,同時在"橋"上,執行著程式,讓區域網A中的所有資料包原封不動的流入B,反之亦然。這樣,區域網A和B就無縫的在鏈路層連線起
android三種加載圖片方式
factor trac turn post static col ati 三種 sam package smalt.music.utils; import android.graphics.Bitmap; import android.graphics.Bitm
php中的public、protected、private三種訪問控制模式及self和parent的區別(轉)
protected 屬性和方法 ted tor pre ons spa imp 數據 php的public、protected、private三種訪問控制模式的區別 public: 公有類型 在子類中可以通過self::var調用public方法或屬性,parent::m
昊天善圈區淺述區塊鏈技術應用開發的三種系統類型及系統特點
導致 金融行業 中心 證明 str private 行業 通過 使用 最近這一兩年,特別今年2018年,區塊鏈徹底火了起來,國外有很多知名大學都把區塊鏈技術加入大學課程當中。區塊鏈開發技術可以廣泛的應用在產品供應鏈、房地產、醫療、在線音樂、金融行業、征信系統等多個行
Linux三種網路
Host-Only 橋接
springmvc的三種Controller處理方式及錯誤處理器
後端控制器主要控制資料和檢視,告知和返回給dispatcherservlet。 控制器可以有3種方法返回值 為了突出重點,先把控制器類buyProduct裡實現的3種方法發一下 1.ModelAndView /* * 1,用modelandview傳回值和檢視,不太推薦