Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android入門筆記 - 網絡通信 - HttpURLConnection

Android入門筆記 - 網絡通信 - HttpURLConnection

編輯:關於Android編程

Android中要與遠程服務器通信有很多方法,今天我們來介紹使用http協議從遠程服務器上獲取數據。

在android中可以使用 一下三種接口和服務器進行http通信:

1. java標准接口:java.net.*;

2. apathe接口: org. apache. http. *;

3. android接口: android.net.*;

今天我們介紹 java的標准接口,接下來我們將介紹:

1. 使用get方法獲取網絡html文件

2. 使用post方法獲取網絡html文件

3. 使用get方法獲取網絡圖片,並且保存到本地

由於代碼比較多,我就直接貼關鍵部分,文章最後附上項目壓縮包文件:

 

代碼篇:

1. 使用get方法獲取網絡html文件:

調用:

 

		btn_get.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				getToOpenUrl(http:// + DOMIN + : + PORT
						+ /Web1/login2.jsp?par1=10086&par2=199);
			}
		});
方法:

 

 

	// 使用get方法獲取數據
	private void getToOpenUrl(String urladdr) {
		try {
			String resultData = ;
			URL url = new URL(urladdr);
			if (url != null) {
				HttpURLConnection connection = (HttpURLConnection) url
						.openConnection();
				connection.setConnectTimeout(1000 * 5);
				InputStreamReader in = new InputStreamReader(
						connection.getInputStream());
				BufferedReader buffer = new BufferedReader(in);
				String inputLine = null;
				while ((inputLine = buffer.readLine()) != null) {
					resultData += inputLine + 
;
				}
				in.close();
				buffer.close();
				connection.disconnect();
				mtv.setText(resultData !=  ? resultData : 讀取內容為null);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
使用 步驟:

 

(1)初始化一個URL對象, 參數是要訪問的服務器地址。 DOMIN 和 PORT 定義的是兩個靜態變量(如下),拼接之後: http://192.168.1.19:8080/Web1/login2.jsp?par1=10086?par2=199,如果學習過jsp的應該知道這裡會傳兩個參數過去,然後服務器jsp文件可以處理(這裡就不做介紹了)

private static final String DOMIN = 192.168.1.19;
private static final String PORT = 8080;

(2)調用 url.openConnection() 獲得一個HttpURLConnection對象,這個就是我們和服務器之間的鏈接。

(3)然後可以通過 conn.getInputStream() 得到服務器的返回流(我們請求的html文件)

(4)解析流數據(這裡我們直接用resultData字符串將獲取的html保持下來,最後答應在 textView中。這裡我們使用bufferreader是為了能一行一行的讀html文件,保持html原來的格式)

 

2. 使用post方法獲取html文件:

調用:

 

		btn_post.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				postToOpenUrl(http:// + DOMIN + : + PORT
						+ /Web1/login3.jsp);
			}
		});

方法:

 

 

	// 使用post方法請求數據
	private void postToOpenUrl(String urladdr) {
		String resultData = ;
		try {
			URL url = new URL(urladdr);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setRequestMethod(POST);
			conn.setUseCaches(true);
			conn.setRequestProperty(Content-Type,
					application/x-www-form-urlencoded);
			conn.connect();
			DataOutputStream out = new DataOutputStream(conn.getOutputStream());
			String content = par= + URLEncoder.encode(abcdefg, gb2312);
			out.writeBytes(content);
			out.flush();
			out.close();

			BufferedReader buffer = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String inputLine = null;
			while ((inputLine = buffer.readLine()) != null) {
				resultData += inputLine + 
;
			}
			buffer.close();
			conn.disconnect();
			mtv.setText(resultData != null ? resultData : 獲取數據為null);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
這裡需要注意,使用post發送請求的時候,請求的參數字段不是直接拼接在地址後面的,應該將參數寫在請求流中。而且post方法更安全,可以設置更多的參數,可傳輸數據量也比get大,關於post和get的區別請大家參看其它資料。

 

使用步驟:

(1)初始化URL對象

(2)調用 url.openConnection() 獲取HttpURLConnection對象

(3)設置可輸入輸出: conn.setDoInput(true); conn.setDoOutput(true)

(4)設置請求方式為 post : conn.setRequestMethod(POST);

(5)設置字符編碼格式 Content-Type: conn.setRequestProperty(Content-Type, application/x-www-form-urlencoded);

(6)然後調用 conn.connect() ; 鏈接服務器,打開通道

(7)然後初始化參數,並使用 writeBytes(content); 想服務器發送請求。這裡就是將參數設置到流中發送到服務器,參數相當於: ?par=abcdefg

 

DataOutputStream out = new DataOutputStream(conn.getOutputStream());
String content = par= + URLEncoder.encode(abcdefg, gb2312);
out.writeBytes(content);
out.flush();
out.close();
(8)發送請求後就是接收服務器返回數據,和前面的get獲得服務器數據是一樣的。

 

大家會發現,在使用get和post的時候,也就是在發送數據方面有不同,其他的都是一樣的。

 

3. 使用get方法獲取網絡圖片:

如果運行過實例你就會發現,我們獲取到的html其實是文本文件,就和txt是一樣的,那麼如果我們要獲取服務器上的圖片,圖片的存儲格式稍有不同的就是二進制存儲,但是對於我們來說都是流,所以在處理的時候,我們只需要將輸入流轉化為BitMap就可以獲得圖片了。

調用:

 

		btn_getPicture.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Bitmap picture = getNetBitMap(http:// + DOMIN + : + PORT
						+ /Web1/img.jpg);
				if (null != picture) {
					img_picture.setImageBitmap(picture);
					SaveJpgBitmapToLocal(picture, /sdcard/, String.format(
                                                 portrait_%d + .jpg, System.currentTimeMillis()));
				} else {
					showToast(獲取網絡圖片失敗);
				}
			}
		});

 

方法:

 

	// 獲取網絡圖片
	private Bitmap getNetBitMap(String mapurl) {
		Bitmap netPicture = null;
		HttpURLConnection conn;
		InputStream is;

		try {
			URL url = new URL(mapurl);
			conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			is = conn.getInputStream();
			netPicture = BitmapFactory.decodeStream(is);
			is.close();
			conn.disconnect();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return netPicture;
	}
我們可以看到,處理方法和get完全一樣,只是在得到輸入流is後,我們直接將其轉化為了 BitMap而已。

 

調用部分還有一個方法是將獲取到的圖片save到本地:

 

	// 保存jpg圖片到本地
	private void SaveJpgBitmapToLocal(Bitmap bitmap, String path,
			String filename) {
		File file = new File(path, filename);
		OutputStream os;
		try {
			os = new FileOutputStream(file);
			bitmap.compress(CompressFormat.JPEG, 100, os);
			os.flush();
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 

好了,實例講解完畢,這裡加幾點注意事項:

如果你運行實例獲取不成功,可能是一下幾個原因造成的:

1. 看服務器啟動木有

2. 服務器地址,端口號

3. 服務器下文件目錄是否正確

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved