HttpClient在Android网络通信中的应用

HttpClient在Android网络通信中的应用—HttpClient传递参数给服务器。

  • HttpClient在Android网络通信中的应用HttpClient传递参数给服务器
    • HttpClient的介绍
    • 步骤简介
    • 源码分析
      • HttpClientjava
        • doPost方法
        • doGet方法
      • Registjava
    • 注意事项

HttpClient的介绍

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 (GA) (2015-09-11)
HttpClient的介绍

步骤简介

1)、后台程序用Eclipse for JavaEE完成,具体就是一个姓名,年龄,密码的表单传递和后台处理。
2)、客户端方面创建HttpClientThread继承Thread类来完成网络线程的操作,如果Eclipse没有集成HttpClient功能,那么就必须在libs文件下导入相关架包,架包已经上传,下载地址如下:httpclient-4.2.5.jar
3)、新建登陆布局Xml文件regist.xml和登录用的RegistActivity,在RegistActivity中关联regist.xml,接着在RegistActivity中新建并调用HttpClient线程,实现传参功能。

源码分析

HttpClient.java

doPost方法

1)、重写构造方法
2)、新建一个HttpClinent对象,名为client。
3)、将数据存储在动态数组 ArrayList<>里面,动态数组里面存储着NameValuePair,这是一个用于表单数据存储的特殊类。
4)、将动态数组存储在Post里面,Post也可以理解成一个容器。
5)、将Post利用client的execute方法传递给服务器,这样就把数据发送给服务器了。
6)、判断服务器返回的结果码getStatusCode是不是有问题,没有问题就把返回的内容也就是content打印到客户端的控制上。

doGet方法

1)、将数据存储在动态数组url里面,这一步在Activity里面实现。
2)、重写构造方法
3)、新建一个HttpGet对象,就叫httpGet,将url传入。
4)、新建一个HttpClinent对象,名为client。
5)、使用client的execute方法,把httpGet传入,间接的将url传入,这样就把数据发送给服务器了。
6)、判断服务器返回的结果码getStatusCode是不是有问题,没有问题就把返回的内容也就是content打印到客户端的控制上。

包含了HttpClient的doPost方法doGet方法

package com.example.http_01;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
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.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

//通过使用HttpClient来完成对服务器的数据传输和下载
public class HttpClientThread extends Thread {

    private String url;

    //这个构造方法是doGet的,只需要传递url。实体数据包含在url里面传递给了服务器。
    /*doGet方法 2)*/
    public HttpClientThread(String url){
        this.url=url;
    }

    private String name;
    private String age;
    private String Password;

    //这个构造方法是doPost的,需要传递实体数据。
    /*doPost方法 1)*/
    public HttpClientThread(String url,String name,String age,String Password){

        this.url = url;
        this.name = name;
        this.age = age;
        this.Password = Password;

        }

    private void doHttpClientPost(){

        //因为所有的数据发送都是通过HttpClinent所以我们要创建一个HttpClinent类
        /*doPost方法 2)*/
        HttpClient client = new DefaultHttpClient();
        //因为是用ClientPost所以要创建一个HttpPost类,把URL传进来。
        HttpPost post = new HttpPost(url);
        /*doPost方法 3)*/
        //创建一个ArrayList来存储传向服务器的参数,NameValuePair是HttpClient项目里面的一个类,用于FORM数据存储的。
        ArrayList<NameValuePair>list=new ArrayList<NameValuePair>();
        try {
            list.add(new BasicNameValuePair("name", URLEncoder.encode(name,"utf-8")));
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        list.add(new BasicNameValuePair("age", age));
        list.add(new BasicNameValuePair("Password", Password));
        /*doPost方法 4)*/
        //将list(ArrayList)传进setEntity,然后通过client.execute把list post给服务器
        /*doPost方法 5)*/
        try {
            post.setEntity(new UrlEncodedFormEntity(list));
            HttpResponse response = client.execute(post);
            //判断服务器返回的结果码getStatusCode是不是有问题,
/*doPost方法 6)*/         if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
                String Content = EntityUtils.toString(response.getEntity());
                System.out.println("Content-------->"+Content);
            }
        } 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();
        }

    }

    //利用HttpClient的Get方式向服务器发送请求,对应的构造方法只用传一个url参就可以了。
    private void dohttpClientGet(){
         /*doGet方法 3)*/
        HttpGet httpGet=new HttpGet(url);
        //因为所有的数据发送都是通过HttpClinent所以我们要创建一个HttpClinent类
         /*doGet方法 4)*/
        HttpClient client = new DefaultHttpClient();
        //得到一个响应对象
        HttpResponse response;
        try {
            /*doGet方法 5)*/
            response = client.execute(httpGet);
            //拿到response对象之后,如果服务器返回的结果码是没有问题的,我们就可以拿到服务器返回给我们的数据。服务器返回给我们的数据储存在content里面。
/*doGet方法 6)*/          if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
                String content = EntityUtils.toString(response.getEntity());
                //打印拿到的数据
                System.out.println("content-------->"+content);

            }
        } catch (ClientProtocolException 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方法或者doPost方法,注释掉不用的哪一个。
        dohttpClientGet();
        //doHttpClientPost();
    }

}

Regist.java

package com.example.http_01;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.view.View.OnClickListener;

public class RegistActivity extends Activity {
    private EditText name;
    private EditText age;
    private EditText Password;
    private Button   regist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.regist);

        name = (EditText) findViewById(R.id.EditText_name);  
        age = (EditText) findViewById(R.id.EditText_age);
        Password = (EditText) findViewById(R.id.EditText_Password);
        regist = (Button) findViewById(R.id.regist);

        regist.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                String url = "http://192.168.1.104:8080/web/MyServlet";

            /*********************************************************/
                /*通过dohttpClientGet()方法传参*/
                try {
                /*doGet方法 1)*/
                url=url+"?name="+URLEncoder.encode((name.getText().toString()),"utf-8")+"&age="+age.getText().toString()+"&Password="+Password.getText().toString();
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                new HttpClientThread(url).start();
            /********************************************************/
            两种方法需要注释其中一个
                /*通过doHttpClientPost()方法传参。*/
               /* new HttpClientThread(url,name.getText().toString(),age.getText().toString(),Password.getText().toString()).start();*/

           }
        });
    }
}

regist.xml

“`

注意事项

1)、使用Android Studio编写Android网络通信部分的代码时,可能没有HttpClient的架包,需要我们自己导入。
2)、注意填写url传入的IP,一般是电脑主机的IP。真机调试需要手机和电脑接入同一个网络。
3)、记得加网络访问的权限
4)、new Thread类,都必须调用start方法,否则不能运用。

你可能感兴趣的:(android,网络,通信)