android中與tomcat之間的通信--登錄系統

項目中一直是用wcf作爲android端與services端的通信,但是作爲大家普遍的通信方式不是很瞭解,就做了一個小型的登錄系統,一天多的調試終於把前後端的連接調試成功了。這裏大致的講解下前段代碼和後端代碼是如何關聯的。

在這個登錄系統中有兩條線,一條是android把數據傳送給服務器端,另外一條是服務器端把判斷結果返回給安卓端進行判斷。

一、android端把數據傳送給服務器端 


 <span style="font-size:12px;">//URL 指的想請求的服務器端的所對應的Servlet ,例如http://192.168.21.41:8080/androidweb/LoginServlet
            HttpPost request = new HttpPost(url);
            //遍歷Map中的中的參數,全部轉化成NameValuePair類型,並放在List集合中
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            for(String key : rawParams.keySet())
            {
                params.add(new BasicNameValuePair(key , rawParams.get(key)));
            }
            //把List<NameValuePair>所存儲的參數放在HTTPPost 對象中
            request.setEntity(new UrlEncodedFormEntity(params,"utf_8"));
            //創建DefaultHttpClient 的對象,
            DefaultHttpClient client = new DefaultHttpClient();
            //在request對象中存儲了URL以及要傳送到後臺去的參數
            HttpResponse httpResponse = client.execute(request);</span>
在上述代碼中可以看到以下幾點

1、請求的URL存放在了HttpRequest 對象中,

2、所有的參數首先轉化成BasicNameValuePair(Key,value),其中key對應的是參數名,value對應的是參數值,然後把List的BasicNameValuePair集合通過 UrlEncodeFormEntity()實現編碼的設置,不然有可能會出現亂碼的情況

3、創建的DefaultHttpClient的對象,執行HttpRequest對象中的URL以及參數傳遞

那麼在服務器端如何接受安卓端傳過來的參數呢?

<span style="font-size:12px;">package com.androidweb.servlet;

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 LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// super.doGet(req, resp);
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		if (null == req) {
			return;
		}

		resp.setContentType("text/html;charset=utf-8");
		req.setCharacterEncoding("utf-8");
		// 獲取android傳過來的參數
		String username = req.getParameter("UserEmail");
		String password = req.getParameter("UserPassword");
		// 進行邏輯判斷
		int result = -1;
		if (username.equals("admin")) {
			if (password.equals("123456")) {
				result = 0; // /< 正確
			} else {
				result = 2; // /< 密碼錯誤
			}
		} else {
			result = 1; // /< 用戶名錯誤
		}

		// 把邏輯判斷結果傳送到安卓端
		resp.setCharacterEncoding("utf-8");
		PrintWriter out = resp.getWriter();
		out.println(result);
		out.flush();
		out.close();
	}
}</span>

通過doPost中的HttpServletRequest 的對象,通過getParamerter()方法,獲取相應的參數值,然後進行邏輯處理

二、服務器端的數據傳送到android端

       如代碼,把Result結果傳送到android端

<span style="font-size:12px;">// 把邏輯判斷結果傳送到安卓端
		resp.setCharacterEncoding("utf-8");
		PrintWriter out = resp.getWriter();
		out.println(result);
		out.flush();
		out.close();</span>
那麼,在android端是如何接收的呢?以下是android端的代碼:

//在request對象中存儲了URL以及要傳送到後臺去的參數
	<span style="font-size:12px;">		HttpResponse httpResponse = client.execute(request);
			if (httpResponse.getStatusLine()
				.getStatusCode() == 200)
			{
				String result = EntityUtils.toString(httpResponse.getEntity());
			}</span>
在android端傳送數據到服務其端時,會返回一個HttpResponse的對象,在這個對象中,包含着服務器端傳送到android端的數據,通過HttpResponse對象中的getEntity()的方法,可以取出服務器端傳過來的參數。

好了,大致介紹的就是這些,在前後端進行數據通信時,出現了些問題,就是地址參數都是對的,但是就是連接不到服務器端,最後通過ping 服務器端才發現,我的服務器端是處於局域網中,android平板連接的是外網的wifi,不在一個網段,所以連接不上,,最後調整android平板WiFi,連接到局域網中的wifi,問題順利解決\(^o^)/~。

源代碼下載地址:

http://download.csdn.net/detail/oyeshuier/8536135



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章