Android通過get,post方式客戶端與服務器端交互實例(慕課網筆記)

來自:http://www.imooc.com/learn/304
一個簡單的Android客戶端和服務器端傳送數據的例子,客戶端界面如下:
這裏寫圖片描述
輸入兩個字符串name,age點擊register,在服務器端將我們輸入的內容打印出來。
1 服務器端
新建一個dynamic web project,工程名字:web,新建一個servlet,名稱:MyServlet。重寫doGet,doPost方法。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");//接收來自客戶端的參數
        String age = request.getParameter("age");

        /*PrintWriter: prints text data to a character stream
        getWriter :Returns a PrintWriter object that can send character text to the client
        */
        PrintWriter outPrintWriter = response.getWriter();
        outPrintWriter.println("these paras will be sent to client: name = "+ name + ", age = " + age);
        System.out.println("MyServlet:name = " + name);
        System.out.println("MyServlet:age = " + age);
    }

服務器端很簡單,就這麼多。
2 客戶端
2.1 新建佈局文件register.xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="1">
   <TableRow>
       <TextView 
           android:id="@+id/tv_name"
           android:layout_height="wrap_content"
           android:text="name"/>
       <EditText 
           android:id="@+id/edit_name"
           android:layout_height="wrap_content"/>"
   </TableRow>
   <TableRow>
       <TextView 
           android:id="@+id/tv_age"
           android:layout_height="wrap_content"
           android:text="age"/>
       <EditText 
           android:id="@+id/edit_age"
           android:layout_height="wrap_content"/>
   </TableRow>  
   <TableRow>
       <Button 
           android:id="@+id/btn_register"
           android:layout_height="wrap_content"
           android:text="register"
           android:layout_span="2"/>
   </TableRow>
</TableLayout>

2.1 新建對應的java類文件RegisterActivity.java

public class RegisterActivity extends Activity {
    private EditText name;
    private EditText age;
    private Button register;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);
        name = (EditText) findViewById(R.id.edit_name);
        age = (EditText) findViewById(R.id.edit_age);
        register = (Button) findViewById(R.id.btn_register);
        register.setOnClickListener(new OnClickListener() {
            String url = "http://223.2.45.232:8080/web/MyServlet";//這裏寫自己電腦的IP
            @Override
            public void onClick(View v) {
                new HttpThread1(url, name.getText().toString(), age.getText().toString()).start();

            }
        });
    }

}

2.2 新建一個HttpThread1.java繼承自Thread,將與服務器交互的代碼放在這裏。我們先使用get的方式訪問。

/*
 * 在子線程中執行和服務器的交互操作
 * */
public class HttpThread1 extends Thread {

    private String url;
    private String name;
    private String age;

    public HttpThread1(String url, String name, String age) {       
        this.url = url;
        this.name = name;
        this.age = age;
    }
    private void doGet()//使用get方式給服務器傳參數
    {   
        try {
            url = url + "?name=" + name + "&age=" + age;//通過get方式傳參數            
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(5000);
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String str;
            while ((str = reader.readLine()) != null) {
                sb.append(str);
            }
            Log.d("HttpThread1", sb.toString());//將從服務器接收來的數據打印出來
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        doGet();        
    }

}

運行Android程序,輸入參數即可。
2.3 我們使用post的方式訪問服務器
在HttpThread1.java中新增一個doPost方法

private void doPost()//使用post方式給服務器傳參數
    {       
        try {                       
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setReadTimeout(5000);
            connection.setRequestMethod("POST");
            OutputStream outputStream = connection.getOutputStream();
            String content = "name=" + name + "&age=" + age;
            //將我們要發送的string數據轉化爲字節數組
            outputStream.write(content.getBytes());//得到一個content的字節數組,返回該操作系統默認的編碼格式的字節數組
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String str;
            while ((str = reader.readLine()) != null) {
                sb.append(str);
            }
            Log.d("HttpThread1", sb.toString());
        } catch (MalformedURLException e) {         
            e.printStackTrace();
        } catch (IOException e) {           
            e.printStackTrace();
        }
    }

然後在run方法中調用即可。
3 以上代碼無法處理中文,當我們運行客戶端程序,傳入中文參數時就會出現亂碼,這種情況下我們只需要做一下編碼轉換即可。
3.1 修改MyServlet.java中的doPost方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");//接收來自客戶端的參數
        String age = request.getParameter("age");       
        /*PrintWriter: prints text data to a character stream
        getWriter :Returns a PrintWriter object that can send character text to the client
        */
        response.setContentType("text/html;charset=utf-8");
        PrintWriter outPrintWriter = response.getWriter();
        //outPrintWriter.println("these params will be sent to client: name = "+ name + ", age = " + age);      
        outPrintWriter.println("these params will be sent to client: name = "+ new String(name.getBytes("ISO-8859-1"),"utf-8") + ", age = " + age); //將編碼轉爲utf-8    
        //System.out.println("MyServlet:name = " + name);
        System.out.println("MyServlet:name = " + new String(name.getBytes("ISO-8859-1"),"utf-8"));//將編碼轉爲utf-8
        System.out.println("MyServlet:age = " + age);
    }

3.2 在HttpThread1.java中對doGet()方法中的url做編碼轉換,即

//如果要傳含有中文的name,需要將name轉換爲utf-8編碼
url = url + "?name=" + URLEncoder.encode(name, "utf-8") + "&age=" + age;//通過get方式傳參數

3.3 當使用post方式時就無需轉換編碼了,因爲Android系統本身的默認配置中提供了utf-8編碼的支持,因此不用修改HttpThread1.java中doPost()方法了。

源碼在這裏:http://download.csdn.net/detail/hnyzwtf/9382615

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