前面相继介绍了Android网络编程里的Socket传输图片HttpURLConnection,今天看HttpClient.

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

【备注:开发后台server用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文以下的server方面操作在普通版的Eclipse也是能够的。

我这里为了和ADT-bundle分开。特意又一次安个JavaEE版的Eclipse。】

1、下载Eclipse的Tomcat插件:http://www.eclipsetotale.com/tomcatPlugin.html 将其解压得到com.sysdeo.eclipse.tomcat_3.3.0目录。

将它拷贝到eclipse的plugins目录下。

重新启动Eclipse会看到上面有三个小猫,哈哈

2、下载apache-tomcat-7.0.53-windows-x86 最新到8.0了,但Eclipse支持貌似最高7.0,所以还是用7.0。解压apache-tomcat-7.0.53-windows-x86至C盘根目录,配置环境变量,新增CATALINA_HOME 路径为:C:\apache-tomcat-7.0.53 或者直接将这个变量配置到Path里都ok。

 然后双击bin目录下的startup脚本。浏览器输入:http://localhost:8080/ 看到小猫表示windows上的tomcat配好了。

3、新建一个javaproject,在里面选择Tomcat Projectproject如图所看到的:

配置Tomcat和Server选项:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

备注:新建project这块也能够在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("<html>");
// out.println("<head>");
// out.println("<title>Hello,Servlet!</title>");
// out.println("</head>");
// out.println("<body>");
// out.println("Hello,First Servlet!");
// out.println("</body>");
// out.println("</html>");
out.println("Hello,第一个Tomcat!!!");
out.close();
}

2.在WEB-INF目录下新建文件wem.xml,内容例如以下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app >
<servlet>
<servlet-name>test_yan</servlet-name>
<!-- 名字随便 -->
<servlet-class>org.yanzi.testtomcat.TestTomcat</servlet-class>
<!-- servlet类名 -->
</servlet>
<servlet-mapping>
<servlet-name>test_yan</servlet-name>
<url-pattern>/login</url-pattern>
<!-- url訪问虚拟路径,最后我们就是通过project名/login进行訪问的。像这样http://127.0.0.1:8000/LoginAction/login -->
</servlet-mapping>

</web-app>

关于上面的配置注意:a. servlet-name是servlet的名字,这个名字能够随便起。

仅仅要servlet-name标签里名字一样就能够了。b. servlet-class里写包名+类名。c. url-pattern这里也是随便写的,是输入浏览器里的地址。本博文中浏览器的地址是:

http://localhost:8080/TestTomcat/login     这里的8080是端口,是在tomcat安装文件中的conf里的server.xml配置好的。用默认的就ok。除非此端口已被其它占用。

TestTomcat这里指的是project的名字。而非类的名字。最后的“/login”跟web.xml里相应,注意后面不要再多加一个斜杠成这样"/login/", 这是解析不了的。

3. 改动conf目录下的tomcat-users.xml文件。在里面加入一个用户:

 <role rolename="manager"/> 
  <user username="admin" password="admin" roles="manager"/>

默认的都是全被凝视掉的。

然后就能够点击eclipse上的小猫头像。开启这个servlet服务了。浏览器输入http://localhost:8080/TestTomcat/login 能够看到:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

在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("<html>");
out.println("<head>");
out.println("<title>Tomcat Servlet測试</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello,First Servlet!");
out.println("</body>");
out.println("</html>");
out.println("Hello,第一个Tomcat!!!");
out.close();
}

看到效果:

这是由于用html格式给它设置了标题名字,并打印了一句话。

这里真想吐槽一下,最初我用百度浏览器倒置了两个小时都没有出来。后来在google浏览器里一输入就ok了。

真心坑爹啊。

另外,假设浏览器在看视频。貌似也是出不来的。

大爷的。此点么深究!

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

由于我准备再手机上用doPost跟Tomcat通信。传递一个username和password。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("<html>");
out.println("<head>");
out.println("<title>Tomcat Servlet測试</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello,哥知道你是浏览器訪问的.");
out.println("</body>");
out.println("</html>");
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();
} /**
* 推断登录名和password
* @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客户端的开发,这里我弄两个button分别相应HttpPost和HttpGet两种方式跟server通讯。

以下是个ScrollView显示server回传结果.效果例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

AndroidManifest.xml里加权限:  <uses-permission android:name="android.permission.INTERNET"/>

activity_main.xml的内容:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <EditText
android:id="@+id/edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入username" /> <EditText
android:id="@+id/edit_code"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/edit_name"
android:hint="输入password" /> <LinearLayout
android:id="@+id/layout_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal" > <Button
android:id="@+id/btn_submit_post"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="POST登录 " /> <Button
android:id="@+id/btn_submit_get"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="GET登录 " />
</LinearLayout> <ScrollView
android:id="@+id/info_scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/layout_btn" > <TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结果显示........." />
</ScrollView> </RelativeLayout>

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, Void, String>{
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 = "password错误.....";
}else if(res.equals("2")){
info = "username错误.....";
}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方式跟server传递数据
* @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);//通过网络与server建立连接的超时时间
HttpConnectionParams.setSoTimeout(params, 5000);//读响应数据的超时时间
httpRequest.setParams(params);
//以下開始跟server传递数据,使用BasicNameValuePair
List<BasicNameValuePair> paramsList = new ArrayList<BasicNameValuePair>();
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

Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例的更多相关文章

  1. Eureka 的 Application Client client的执行演示样例

            上篇以一个 demo 演示样例介绍了 Eureka 的 Application Service 客户端角色.今天我们继续了解 Eureka 的 Application Client 客 ...

  2. Cocos2d-x 3.2 Lua演示样例 XMLHttpRequestTest(Http网络请求)

    Cocos2d-x 3.2 Lua演示样例 XMLHttpRequestTest(Http网络请求)     本篇博客介绍Cocos2d-x 3.2Lua演示样例中的XMLHttpRequestTes ...

  3. Android之——多线程下载演示样例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明 ...

  4. Android平台调用Web Service:演示样例

    近期在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛,懂点Andr ...

  5. 【UNIX网络编程(三)】TCP客户/server程序演示样例

    上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...

  6. Eureka 的 Application Service client的注冊以及执行演示样例

            Eureka 服务器架起来了(关于架设步骤參考博客<Linux 下 Eureka 服务器的部署>),如今怎样把我们要负载均衡的服务器(也就是从 Application Cl ...

  7. Android利用Volley异步载入数据完整具体演示样例(二)

    MainActivity例如以下: package cc.y; import android.app.Activity; import android.content.Context; import ...

  8. android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

    本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...

  9. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

随机推荐

  1. PAT甲级——A1141 PATRankingofInstitution

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  2. Config JAVA evironment for LoadRunner

    1. Install jdk 2. Set system variables eg. JAVA_HOME = C:\Program Files (x86)\Java\jdk1.6.0_43 class ...

  3. 2.Jmeter 快速入门教程(二)--创建简单web测试 打印 E-mail

    今天我们就来实际用Jmeter创建一个测试场景,并进行性能测试. 注:由于本人使用中文版本,使用英文版本的请注意具体的菜单及参数名称. 1. 添加线程组(相当于lr里的scenario 设置) 打开j ...

  4. CSRF如何防御

    总结网上所说,细细的归纳下 CSRF利用的时网站对用户网页浏览器的信任.在受害人不知情的情况下以 受害人的名义伪造请求发送给攻击者的站点. 1.首先XSS漏洞先防护好(一般是通过过滤器更改特殊字符) ...

  5. GNU Linux 64汇编学习

    函数调用传参: 第一个参数:rdi, 第二个参数:rsi 函数调用栈结构: 返回值 第一个参数 第二个参数 +----------+ rsp-24 | a | +----------+ rsp-16 ...

  6. JS点击

    本来是想做一个鼠标点击事件:A,B两个东西,B先隐藏,点击A,B出现,再点一次A,B消失,然后发现在判断不同的情况下,出现了一点小问题 暂时没有问题的写法: <!DOCTYPE html> ...

  7. vue--先决篇

    一.vue介绍: vue是一个渐进式Javascript框架. 渐进式:即有一个核心库,在需要的时候,在逐渐添加插件的一种概念. (1)MVVM和MVC模式: MVVM是Model-View-View ...

  8. 【记录】ajax跨域问题jsonp正确的使用方式

    最近遇到ajax请求跨域问题,解决方案用jsonp,现记录如下: //跨域请求jsonp封装 function doJsonPostCallBack(type, url, data,async, ca ...

  9. CentOs如何找回root密码

    当CentOs的root密码忘了的时候,可以进入单用户模式,更改一下root密码就可以了. 具体操作如下 1.重启Linux后,在此界面,3秒内按下回车键 2.出现此界面 3.按e键,进入下图,然后把 ...

  10. JSON对象排序并生成URL参数

    1、for in function jsontourl(param) { let params = {}, data=[]; let arr = Object.keys(param).sort(); ...