您的位置:首页 > 理论基础 > 计算机网络

HttpClient在Android网络通信中的应用

2015-11-14 20:51 423 查看

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方法,否则不能运用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: