项目中一直是用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