Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android網絡(3):HttpClient作客戶端,Tomcat Servlet作服務器的交互示例

Android網絡(3):HttpClient作客戶端,Tomcat Servlet作服務器的交互示例

編輯:關於Android編程

前面相繼介紹了Android網絡編程裡的Socket傳輸圖片、HttpURLConnection,今天看HttpClient.

第一部分:JavaEE版的Eclipse配置Tomcat

【備注:開發後台服務器用Eclipse的JavaEE版最好的,但單就Tomcat來說(不寫jsp之類的),本文下面的服務器方面操作在普通版的Eclipse也是可以的。我這裡為了和ADT-bundle分開,特意重新安個JavaEE版的Eclipse。】

1、下載Eclipse的Tomcat插件:http://www.eclipsetotale.com/tomcatPlugin.html 將其解壓得到com.sysdeo.eclipse.tomcat_3.3.0文件夾。將它復制到eclipse的plugins文件夾下。 重啟Eclipse會看到上面有三個小貓,哈哈

vcWxvqOs5K/AwMb3yuTI6zpodHRwOi8vbG9jYWxob3N0OjgwODAvIL+0tb3QocOose3KvndpbmRvd3PJz7XEdG9tY2F0xeS6w8HLoaM8L3A+PHA+M6Gi0MK9qNK7uPZqYXZhuaSzzKOs1NrA78Pm0aHU8VRvbWNhdCBQcm9qZWN0uaSzzMjnzbzL+cq+OjwvcD48cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140504/2014050408590624.png" alt="\" />

配置Tomcat和Server選項:

\

\


備注:新建工程這塊也可以在Web裡選擇新建Dynamic Web Project,這是標准的使用Servlet、JSP等技術開發動態網站的項目,需要JavaEE版的Eclipse。

\


第二部分:聯通浏覽器和Tomcat

即在浏覽器輸入一個網址,tomcat裡返回一句話,浏覽器收到並顯示。之所以弄這一步一是為了測試,二是後來會發現,Android裡的HttpClient就跟這個浏覽器一樣。

1.在WEB-INF/src文件夾下新建包名org.yanzi.testtomcat,在裡面新建一個類TestTomcat繼承自HttpServlet.並重寫裡面的doGet方法。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");


PrintWriter out = resp.getWriter();
// //用HTML格式給浏覽器返回數據
// out.println("");
// out.println("");
// out.println("Hello,Servlet!");
// out.println("");
// out.println("");
// out.println("Hello,First Servlet!");
// out.println("");
// out.println("");
out.println("Hello,第一個Tomcat!!!");
out.close();
}

2.在WEB-INF文件夾下新建文件wem.xml,內容如下:







test_yan

org.yanzi.testtomcat.TestTomcat



test_yan
/login





關於上面的配置注意:a. servlet-name是servlet的名字,這個名字可以隨便起。只要servlet-name標簽裡名字一樣就可以了。b. servlet-class裡寫包名+類名。c. url-pattern這裡也是隨便寫的,是輸入浏覽器裡的地址。本博文中浏覽器的地址是:

http://localhost:8080/TestTomcat/login 這裡的8080是端口,是在tomcat安裝文件裡的conf裡的server.xml配置好的,用默認的就ok。除非此端口已被其他占用。 TestTomcat這裡指的是工程的名字,而非類的名字。最後的“/login”跟web.xml裡對應,注意後面不要再多加一個斜槓成這樣"/login/", 這是解析不了的。

3. 修改conf文件夾下的tomcat-users.xml文件,在裡面添加一個用戶:



默認的都是全被注釋掉的。

然後就可以點擊eclipse上的小貓頭像,開啟這個servlet服務了。浏覽器輸入http://localhost:8080/TestTomcat/login 可以看到:

\

在doGet()函數裡用html格式輸出,即:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");


PrintWriter out = resp.getWriter();
//用HTML格式給浏覽器返回數據
out.println("");
out.println("");
out.println("Tomcat Servlet測試");
out.println("");
out.println("");
out.println("Hello,First Servlet!");
out.println("");
out.println("");
out.println("Hello,第一個Tomcat!!!");
out.close();
}

看到效果:

\

這是因為用html格式給它設置了標題名字,並打印了一句話。這裡真想吐槽一下,最初我用百度浏覽器倒置了兩個小時都沒有出來,後來在google浏覽器裡一輸入就ok了。真心坑爹啊。另外,如果浏覽器在看視頻,貌似也是出不來的。大爺的,此點麼深究!!

第三部分:重寫TestTomcat裡的doPost()和doGet()方法。

因為我准備再手機上用doPost跟Tomcat通信,傳遞一個用戶名和密碼。Tomcat判斷後再返回結果。改好後的TestTomcat.java的完整文件如下:

package org.yanzi.testtomcat;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestTomcat extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private static final int NAME_CODE_RIGHT = 0; //
	private static final int CODE_WRONG = 1;     //
	private static final int NAME_WRONG = 2;     //

	public TestTomcat(){

	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub

		if(req == null){
			return;
		}
		resp.setContentType("text/html;charset=utf-8");
		req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");
		PrintWriter out = resp.getWriter();
		String name = req.getParameter("NAME");
		String code = req.getParameter("CODE");

/*		//浏覽器訪問,沒傳遞任何參數。用HTML格式給浏覽器返回數據
		out.println("");
		out.println("");
		out.println("Tomcat Servlet測試");
		out.println("");
		out.println("");
		out.println("Hello,哥知道你是浏覽器訪問的.");
		out.println("");
		out.println("");
		out.println("Hello,第一個Tomcat!!!");
		out.close();*/

		//手機客戶端訪問
		int ret = checkSubmit(name, code);
		out.print(ret);
		out.flush();
		out.close();

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		if(req == null){
			return;
		}

		resp.setContentType("text/html;charset=utf-8");
		req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");

		PrintWriter out = resp.getWriter();
		String name = req.getParameter("NAME");
		String code = req.getParameter("CODE");

		int ret = checkSubmit(name, code);
		out.print(ret);
		out.flush();
		out.close();
	}

	/**
	 * 判斷登錄名和密碼
	 * @param name
	 * @param code
	 * @return
	 */
	private int checkSubmit(String name, String code){
		int ret = -2;
		if(name.equals("admin")){
			if(code.equals("123")){
				ret = NAME_CODE_RIGHT;
			}else{
				ret = CODE_WRONG;
			}
		}else{
			ret = NAME_WRONG;
		}
		return ret;
	}


}

第四步:Android客戶端的開發,這裡我弄兩個按鈕分別對應HttpPost和HttpGet兩種方式跟服務器通訊。下面是個ScrollView顯示服務器回傳結果.效果如下所示:

\

AndroidManifest.xml裡加權限:


activity_main.xml的內容:



    

    

    

        

MainActivity.java裡的內容:

package org.yanzi.testtomecat;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.DefaultClientConnection;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {
	public static final String URL = "http://192.168.16.8:8080/TestTomcat/login";
	Button submitBtnPost = null;
	Button submitBtnGet = null;
	TextView infoTextView = null;
	EditText nameEdit = null;
	EditText codeEdit = null;
	ScrollView scrollView = null;
	boolean isPost = true; //默認采取post登錄方式
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		scrollView = (ScrollView)findViewById(R.id.info_scroll_view);
		submitBtnPost = (Button)findViewById(R.id.btn_submit_post);
		submitBtnGet = (Button)findViewById(R.id.btn_submit_get);
		infoTextView = (TextView)findViewById(R.id.tv_info);
		nameEdit = (EditText)findViewById(R.id.edit_name);
		codeEdit = (EditText)findViewById(R.id.edit_code);
		submitBtnPost.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				isPost = true;
				new SubmitAsyncTask().execute(URL);
			}
		});
		submitBtnGet.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				isPost = false;
				new SubmitAsyncTask().execute(URL);
			}
		});
	}
	


	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	public class SubmitAsyncTask extends AsyncTask{
		String info = "";
		@Override
		protected String doInBackground(String... params) {
			// TODO Auto-generated method stub
			String url = params[0];
			String reps = "";
			if(isPost){
				info = "HttpPost返回結果: ";
				reps = doPost(url);
			}else{
				info = "HttpGet返回結果: ";
				reps = doGet(url);	
			}
			return reps;
		}

		@Override
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			infoTextView.append("\n" + info + result +"\n");
			String res = result.trim();
			if(res.equals("0")){
				info = "驗證通過.....";
			}else if(res.equals("1")){
				info = "密碼錯誤.....";
			}else if(res.equals("2")){
				info = "用戶名錯誤.....";
			}else if(res.equals("-1")){
				info = "返回結果異常!";
			}
			infoTextView.append(info + "\n");
			scrollView.fullScroll(ScrollView.FOCUS_DOWN);
			super.onPostExecute(result);
		}
		


	}
	private String doGet(String url){
		String responseStr = "";
		try {
			String name = nameEdit.getText().toString().trim();
			String code = codeEdit.getText().toString().trim();
			String getUrl = URL + "?NAME=" + name+"&"+"CODE=" + code;		
			
			HttpGet httpRequest = new HttpGet(getUrl);
			HttpParams params = new BasicHttpParams();
			ConnManagerParams.setTimeout(params, 1000);
			HttpConnectionParams.setConnectionTimeout(params, 3000);
			HttpConnectionParams.setSoTimeout(params, 5000);
			httpRequest.setParams(params);

			HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
		final int ret = httpResponse.getStatusLine().getStatusCode();
		if(ret == HttpStatus.SC_OK){
			responseStr = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
		}else{
			responseStr = "-1";
		}
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return responseStr;
	}
	
	/**
	 * 用Post方式跟服務器傳遞數據
	 * @param url
	 * @return
	 */
	private String doPost(String url){
		String responseStr = "";
		try {
			HttpPost httpRequest = new HttpPost(url);
			HttpParams params = new BasicHttpParams();
			ConnManagerParams.setTimeout(params, 1000); //從連接池中獲取連接的超時時間
			HttpConnectionParams.setConnectionTimeout(params, 3000);//通過網絡與服務器建立連接的超時時間
			HttpConnectionParams.setSoTimeout(params, 5000);//讀響應數據的超時時間
			httpRequest.setParams(params);
			//下面開始跟服務器傳遞數據,使用BasicNameValuePair
			List paramsList = new ArrayList();
			String name = nameEdit.getText().toString().trim();
			String code = codeEdit.getText().toString().trim();
			paramsList.add(new BasicNameValuePair("NAME", name));
			paramsList.add(new BasicNameValuePair("CODE", code));
			UrlEncodedFormEntity mUrlEncodeFormEntity = new UrlEncodedFormEntity(paramsList, HTTP.UTF_8);
			httpRequest.setEntity(mUrlEncodeFormEntity);
			HttpClient httpClient = new DefaultHttpClient();
			HttpResponse httpResponse = httpClient.execute(httpRequest);
			final int ret = httpResponse.getStatusLine().getStatusCode();
			if(ret == HttpStatus.SC_OK){
				responseStr = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
			}else{
				responseStr = "-1";
			}

		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return responseStr;
	}

}

要點注釋:

1、核心在doGet()和doPost()兩個函數裡,可以看到用get方式比用post傳遞參數更方便,可以直接寫到url裡。使用get方式時傳遞數據在url裡寫的:

String name = nameEdit.getText().toString().trim();
String code = codeEdit.getText().toString().trim();
String getUrl = URL + "?NAME=" + name+"&"+"CODE=" + code;

post方式時是用BasicNameValuePair來弄的。其他流程都差不多。首先new一個HttpGet或HttpPost,然後設參數,共設三個,作用注釋裡有。然後設參數,傳數據,通過HttpResponse httpResponse = httpClient.execute(httpRequest);得到返回結果。

2、如果在Tomcat裡使用的是out.println(),則再解析數據時需要再得到的String上trim()一下,否則會錯。

3、Android客戶端URL地址為:

public static final String URL = "http://192.168.16.8:8080/TestTomcat/login";

這裡的IP就是電腦的IP加端口號就ok。


當然這僅是個最基本的示例,遺留問題:

1.JSON傳遞數據

2.每次鏈接都開一個DefaultHttpClient很不科學。


參考:

http://blog.chinaunix.net/uid-25799257-id-3774015.html

http://blog.chinaunix.net/uid-25799257-id-3774047.html


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