android系統(tǒng)中提供了3種通信接口:
- 標準Java接口:java.net
- Apache接口:org.apache.http
- android網(wǎng)絡(luò)接口:android.net.http
網(wǎng)絡(luò)編程在開發(fā)無線應(yīng)用程序過程中起到了重要的作用胀屿。在android系統(tǒng)中包括ApacheHttpClient庫烤芦,此庫位執(zhí)行android中的網(wǎng)絡(luò)操作的首選方法。除此之外她紫,android還允許通過標準的java連網(wǎng)api(jva.net包)來訪問網(wǎng)絡(luò)返劲。
在android系統(tǒng)中荆针,存在如下與網(wǎng)絡(luò)連接相關(guān)的包梅鹦。
- java.net :java.net 提供連網(wǎng)相關(guān)的類,包括流和數(shù)據(jù)套接字之斯、internet協(xié)議及通用的http處理,此為多用途的連網(wǎng)資源遣铝,經(jīng)驗豐富的java開發(fā)人員可立即使用此慣用的包來創(chuàng)建應(yīng)用程序佑刷。
- java.io :經(jīng)管未明確連網(wǎng),但java.io仍然非常重要酿炸。此包中的各項類通過其他java包中提供的套接字和鏈接來使用瘫絮。他們也可以用來與本地文件進行交互(與網(wǎng)絡(luò)交互時經(jīng)常發(fā)生)
- java.nio :java.niob包含表示具體數(shù)據(jù)類型的緩沖的各種類,便于基于java語言的兩個端口之間的網(wǎng)絡(luò)通信填硕。
- org.apache.*:org.apache.表示可為進行http通信提供精細控制和功能的各種包麦萤。可將apache識別為普通的開源服務(wù)器扁眯。
- android.net :android.net 包括可信java.net.* 類之外的各種附加的網(wǎng)絡(luò)接入套接字壮莹。包括URL類,他通常在傳統(tǒng)連網(wǎng)之外的android應(yīng)用程序中使用姻檀。
- android.net.http:包含可操作SSL證書的各種累類命满。
- android.net.wifi:包含可管理android平臺中wifi所有方面的各種類,并非所有的設(shè)備均配備wifi能力施敢。
- android.telephone.gsm:包含管理和發(fā)送短信消息所要求的個各種類周荐。
使用Apache接口
- apache 接口基礎(chǔ)
在apache httpclient 庫中,以下對網(wǎng)絡(luò)連接有用的各種包僵娃。
- org.apache.http.HttpResponse
2.org.apache.http.client.HttpClient
3.org.apache.http.client.methods.HttpGet
4.org.apache.http.client.DefaultHttpClient
5.HttpClient httpclient = new DefaultHttpClient()
如果想從服務(wù)器檢索詞信息概作,則需要使用HttpGet類的構(gòu)造器,例如下面的代碼默怨。
HttpGet request = new HttpGet("http://innovator.samsungmobile.com")
然后使用HttpClient的execute()方法中的HttpGet對象來檢索HttpResponse對象讯榕,
HttpResponse response = client.execute(request)
接著讀取已檢索的響應(yīng),
BufferReader rd = new BufferReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while((line = rd.readline()) != null){
Log.d("output:",line);
}
- Apache 應(yīng)用要點
在android系統(tǒng)中匙睹,可以采用HttpPost和HttpGet來 封裝post和get請求愚屁,再使用HttpClient的execute()方法發(fā)送post和get請求并返回服務(wù)器的響應(yīng)數(shù)據(jù)。
Android中的android.net.* 實際上是通過對Apache的HttpClient的封裝來實現(xiàn)的一個HTTP編程接口痕檬。在Android6.0版本直接刪除了HttpClient類庫霎槐。下面看一個例子:
//創(chuàng)建HttpClient
private HttpClient createHttpClient() {
HttpParams mDefaultHttpParams = new BasicHttpParams();
//設(shè)置連接超時
HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000);
//設(shè)置請求超時
HttpConnectionParams.setSoTimeout(mDefaultHttpParams, 15000);
HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true);
HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8);
//持續(xù)握手
HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true);
HttpClient mHttpClient = new DefaultHttpClient(mDefaultHttpParams);
return mHttpClient;
}
private void useHttpClientGet(String url) {
HttpGet mHttpGet = new HttpGet(url);
mHttpGet.addHeader("Connection", "Keep-Alive");
try {
HttpClient mHttpClient = createHttpClient();
HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);
HttpEntity mHttpEntity = mHttpResponse.getEntity();
int code = mHttpResponse.getStatusLine().getStatusCode();
if (null != mHttpEntity) {
InputStream mInputStream = mHttpEntity.getContent();
String respose = converStreamToString(mInputStream);
Log.i("wangshu", "請求狀態(tài)碼:" + code + "\n請求結(jié)果:\n" + respose);
mInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String converStreamToString(InputStream is) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
String respose = sb.toString();
return respose;
}
HttpURLConnection
post例子:
private void test(){
HttpURLConnection httpURLConnection =null;
try{
URL url = new URL("http://baidu.com");
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setReadTimeout(5000);
httpURLConnection.setRequestMethod("POST");
// 添加header
httpURLConnection.setRequestProperty("Connection","Keep-Alive");
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
StringBuilder mStringBuilder=new StringBuilder();
List<NameValuePair> paramsList = new ArrayList<>();
paramsList.add(new NameValuePair("username", "moon"));
paramsList.add(new NameValuePair("password", "123"));
for (NameValuePair pair:paramsList){
if(!TextUtils.isEmpty(mStringBuilder)){
mStringBuilder.append("&");
}
mStringBuilder.append(URLEncoder.encode(pair.getName(),"UTF-8"));
mStringBuilder.append("=");
mStringBuilder.append(URLEncoder.encode(pair.getParams(),"UTF-8"));
}
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
writer.write(mStringBuilder.toString());
writer.flush();
writer.close();
httpURLConnection.connect();
InputStream mInputStream = httpURLConnection.getInputStream();
int code = httpURLConnection.getResponseCode();
//將返回信息都出來
String respose = converStreamToString(mInputStream);
mInputStream.close();
}catch (IOException io){
io.printStackTrace();
}
}
class NameValuePair{
String params ;
String name;
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
NameValuePair(String params, String value){
}
}