Android学习13-----网络通信(1) 与WEB服务器交换数据
与Web服务器交互:http://dl.iteye.com/upload/attachment/0076/6908/f8624772-72dc-3033-9412-db8648e035ca.png
如果手机要想与web容器交互的话,那么就必须依靠Http协议完成。
一、通过地址重新访问动态Web
首先我们需要建立一个Web程序,现在为了说明问题,我们简单见一个Servlet,然后返回true or false即可
服务器端:AndroidServlet.java
package com.iflytek.demo;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class AndroidServlet */public class AndroidServlet extends HttpServlet {private static final long serialVersionUID = 1L;/** * Default constructor. */public AndroidServlet() {// TODO Auto-generated constructor stub}/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub//http://IP:8080/09AndroidWeb/AndroidServlet?name=xdwang&password=1111String name = request.getParameter("name");String password = request.getParameter("password");if ("xdwang".equals(name) && "1111".equals(password)) {response.getWriter().println("true");} else {response.getWriter().println("false");}}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub}}
客户端:
Web01_Activity.java
package com.iflytek.demo;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.TextView;public class Web01_Activity extends Activity {private TextView infoTxt;public Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {super.handleMessage(msg);switch (msg.what) {case 1:infoTxt.setText(msg.obj.toString());break;default:break;}}};/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);infoTxt = (TextView) super.findViewById(R.id.info);this.HttpHelper();}private void HttpHelper() {final AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {@Overrideprotected void onPostExecute(String result) {final String temp = result;Thread thread = new Thread(new Runnable() {@Overridepublic void run() {Message msg = new Message();msg.what = 1;msg.obj = temp;handler.sendMessage(msg);}});thread.start();}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected String doInBackground(Void... arg0) {boolean flag = false; // 成功与否的标记try {URL url = new URL("http", "IP", 8080,"/09AndroidWeb/AndroidServlet?name=xdwang&password=1111");HttpURLConnection conn = (HttpURLConnection) url.openConnection();byte data[] = new byte;// 开辟一个空间int len = conn.getInputStream().read(data); // 输入流读取if (len > 0) { // 已经读取到内容String temp = new String(data, 0, len).trim();flag = Boolean.parseBoolean(temp); // 取出里面的boolean型数据}conn.getInputStream().close();} catch (Exception e) {return "WEB服务器连接失败!";}if (flag) {return "用户登录成功!";} else {return "用户登录失败!";}}};task.execute();}}AndroidManifest.xml需要添加网络访问权限
<uses-permission android:name="android.permission.INTERNET" />
总结,这种方式是地址重写的方式完成,但是我们知道地址重写是Get请求方式,从上面的Servlet类的处理也可以看出是Get请求,但是这种方式会收到地址传输的限制,所以这时候我们也可以使用post请求方式提交。
二、POST请求
Get请求与Post请求最大的区别在于一个地址显示,一个不显示,具体可以看我写的GET与POST请求。可是如何在Android中实现post请求呢?严格来说,之前的程序并不标准,地址重写问题较多。
使用POST提交访问动态WEB所需要的操作类:
由于WEB连接采用的是HTTP操作协议进行的,所以用户想要发送请求(POST、GET)则可以使用org.apache.http.client.methods.HttpPost类或者是org.apache.http.client.methods.HttpGet类进行。
当用户成功的向Web Server端发送请求后,所有返回的数据将使用org.apache.http.HttpResponse接口保存。
当用户使用HttpResponse的getEntity()方法接受所有返回数据之后,可以使用EntityUtils类进行处理,而且由于HttpResponse是一个接口,所以要想实例化此接口,就要使用org.apache.http.impl.client.DefaultHttpClient类完成。
由于在Web Server上所提供的方法需要参数的传递,所以所有的参数都要使用org.apache.http.message.BasicName.ValuePair类进行封装。
除了处理好参数之外,还需要处理请求时的所需要的编码,通用的编码为UTF-8,而要想指定此编码则必须使用org.apache.http.client.entry.UrlEncodedFormEntity类完成。
此时把服务器端的doPost中再去调用doGet方法:
客户端Web02_Activity.java
package com.iflytek.demo;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;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.os.Handler;import android.os.Message;import android.widget.TextView;public class Web02_Activity extends Activity {private TextView infoTxt = null;private static final String URL = "http://IP:8080/09AndroidWeb/AndroidServlet"; // 请求地址public Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {super.handleMessage(msg);switch (msg.what) {case 1:infoTxt.setText(msg.obj.toString());break;default:break;}}};/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);this.infoTxt = (TextView) super.findViewById(R.id.info);this.HttpHelper();}private void HttpHelper() {final AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {@Overrideprotected void onPostExecute(String result) {final String temp = result;Thread thread = new Thread(new Runnable() {@Overridepublic void run() {Message msg = new Message();msg.what = 1;msg.obj = temp;handler.sendMessage(msg);}});thread.start();}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected String doInBackground(Void... arg0) {boolean flag = false; // 成功与否的标记try {HttpPost request = new HttpPost(URL);List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("name", "xdwang"));params.add(new BasicNameValuePair("password", "1111"));request.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));HttpResponse response = new DefaultHttpClient().execute(request);if (response.getStatusLine().getStatusCode() != 404) { // 现在已经发现了数据了flag = Boolean.parseBoolean(EntityUtils.toString(response.getEntity()).trim());}} catch (Exception e) {return "WEB服务器连接失败!";}if (flag) {return "用户登录成功!";} else {return "用户登录失败!";}}};task.execute();}}
三、网络读取图片
服务器端:
先设计一个返回图片流的工具类
ImageUtil.java
package com.iflytek.util;import java.awt.image.BufferedImage;import java.io.FileInputStream;import java.io.IOException;import java.text.MessageFormat;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;public class ImageUtil {/** * @descrption * @author xdwang * @create 2012-11-16下午8:35:36 * @param response * @param path * 文件路径 * @param type * 图片类型 */public static void showImage(HttpServletResponse response, String path,String type) {try {ServletOutputStream outStream = response.getOutputStream();// 得到向客户端输出二进制数据的对象FileInputStream fis = new FileInputStream(path); // 以byte流的方式打开文件// 读数据byte data[] = new byte;while (fis.read(data) > 0) {outStream.write(data);}fis.close();response.setContentType(MessageFormat.format("image/{0}", type)); // 设置返回的文件类型outStream.write(data); // 输出数据outStream.close();} catch (IOException e) {e.printStackTrace();}}/** * @descrption * @author xdwang * @create 2012-11-16下午8:35:48 * @param response * @param data * byte数组 * @param type * 图片类型 */public static void showImage(HttpServletResponse response, byte[] data,String type) {try {ServletOutputStream outStream = response.getOutputStream();// 得到向客户端输出二进制数据的对象// 读数据outStream.write(data);response.setContentType(MessageFormat.format("image/{0}", type)); // 设置返回的文件类型outStream.write(data); // 输出数据outStream.close();} catch (IOException e) {e.printStackTrace();}}}AndroidServlet.java
package com.iflytek.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.iflytek.util.ImageUtil;/** * Servlet implementation class AndroidServlet */public class AndroidServlet extends HttpServlet {private static final long serialVersionUID = 1L;/** * Default constructor. */public AndroidServlet() {// TODO Auto-generated constructor stub}/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubImageUtil.showImage(response,getServletContext().getRealPath("Java.jpg"), "jpeg");}}Android客户端:
Web03_Activity.java
package com.iflytek.demo;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.ImageView;public class Web03_Activity extends Activity {private ImageView iamgeView = null;private static final String PATH = "http://IP:8080/09AndroidWeb/Java.jpg"; // 请求地址private Bitmap bitmap;public Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {super.handleMessage(msg);switch (msg.what) {case 1:try {iamgeView.setImageBitmap(bitmap);} catch (Exception e) {}break;default:break;}}};/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);this.iamgeView = (ImageView) super.findViewById(R.id.img);this.HttpHelper();}private void HttpHelper() {final AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {@Overrideprotected void onPostExecute(String result) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {Message msg = new Message();msg.what = 1;handler.sendMessage(msg);}});thread.start();}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected String doInBackground(Void... arg0) {ByteArrayOutputStream bos = null; // 内存操作流完成try {URL url = new URL(PATH);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.connect();InputStream input = conn.getInputStream();bitmap = BitmapFactory.decodeStream(input);// bos = new ByteArrayOutputStream();// byte data[] = new byte;// int len = 0;// while ((len = input.read(data)) != -1) {// bos.write(data, 0, len);// }// byte resultData[] = bos.toByteArray();// bitmap = BitmapFactory.decodeByteArray(resultData, 0,// resultData.length); // 把二进制变为图片} catch (Exception e) {} finally {if (bos != null) {try {bos.close();} catch (IOException e) {e.printStackTrace();}}}return null;}};task.execute();}}
页:
[1]