`

Android学习13-----网络通信(1) 与WEB服务器交换数据

阅读更多

与Web服务器交互:

 

如果手机要想与 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=1111
		String 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() {
		@Override
		public 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. */
	@Override
	public 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>() {

			@Override
			protected void onPostExecute(String result) {
				final String temp = result;
				Thread thread = new Thread(new Runnable() {
					@Override
					public void run() {
						Message msg = new Message();
						msg.what = 1;
						msg.obj = temp;
						handler.sendMessage(msg);
					}
				});
				thread.start();
			}

			@Override
			protected void onPreExecute() {
				super.onPreExecute();
			}

			@Override
			protected 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[512];// 开辟一个空间
					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() {
		@Override
		public 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. */
	@Override
	public 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>() {

			@Override
			protected void onPostExecute(String result) {
				final String temp = result;
				Thread thread = new Thread(new Runnable() {
					@Override
					public void run() {
						Message msg = new Message();
						msg.what = 1;
						msg.obj = temp;
						handler.sendMessage(msg);
					}
				});
				thread.start();
			}

			@Override
			protected void onPreExecute() {
				super.onPreExecute();
			}

			@Override
			protected 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[1000];
			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 stub
		ImageUtil.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() {
		@Override
		public 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. */
	@Override
	public 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>() {

			@Override
			protected void onPostExecute(String result) {
				Thread thread = new Thread(new Runnable() {
					@Override
					public void run() {
						Message msg = new Message();
						msg.what = 1;
						handler.sendMessage(msg);
					}
				});
				thread.start();
			}

			@Override
			protected void onPreExecute() {
				super.onPreExecute();
			}

			@Override
			protected 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[1024];
					// 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();
	}

}

 

 

 

 

 

 

  • 大小: 7.9 KB
分享到:
评论

相关推荐

    Android客户端远程登录web服务器数据交换实例

    在Android开发中,实现客户端与Web服务器的数据交换是一项常见的任务,尤其在移动应用需要与远程数据库交互时。本文将深入探讨“Android客户端远程登录Web服务器数据交换实例”,讲解如何使用MySQL数据库、JSON数据...

    ksoap2-android-assembly-3.6.2-jar-with-dependencies

    在移动应用开发中,有时我们需要与服务器进行数据交互,这时候Web服务接口就显得尤为重要。ksoap2-android-assembly-3.6.2-jar-with-dependencies是一个专门为Android平台设计的轻量级库,它简化了SOAP(Simple ...

    ksoap2-android-assembly-2.4-jar-with-dependencies

    kSOAP2是一个轻量级的开源库,专为在...总之,kSOAP2-android是Android开发者与Web服务交互的利器,通过其提供的简单API,可以轻松实现SOAP请求的构建、发送和响应处理,极大地简化了客户端与服务器之间的数据交换。

    ksoap2-android-assembly-2.6.0-jar-with-dependencies.rar

    ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar是一个重要的库文件,它是Android开发者调用Web服务接口的必备工具,尤其适用于那些希望简化网络通信的开发者。 kSOAP2是一个轻量级的开源项目,它提供了...

    android与服务器通信

    在Android应用开发中,与服务器进行通信是必不可少的环节,特别是在构建涉及用户登录、数据交换等应用场景时。本文将深入探讨Android与服务器通信的基本概念、技术选型以及具体实现方式,以标题“android与服务器...

    android视频资讯客户端简单实现--android客户端与web服务器实现

    在Android平台上开发一款视频资讯客户端,涉及到的主要技术点包括网络通信、数据解析、UI布局以及数据展示。...通过合理运用Android提供的工具和库,可以有效地实现客户端与Web服务器之间的数据交换和展示。

    ksoap2-android-assembly-2.5.2-jar-with-dependencies

    在移动开发领域,尤其是Android平台,与服务器进行数据交互是不可或缺的一部分。为了实现这一目标,开发者通常会利用Web Service技术,而KSOAP2是一个非常流行的库,它为Android应用程序提供了方便的Web Service...

    ksoap2-android-assembly-2.4-jar

    在Android开发中,与远程服务器进行数据交换是常见的需求,而SOAP是一种基于XML的协议,广泛用于Web服务交互。kSOAP2库简化了这个过程,提供了方便的API来封装和解封SOAP消息,进行HTTP传输,并处理返回的数据。 ...

    android-rmpt-red5-web

    【标题】"android-rmpt-red5-web" 涉及的是一个Android应用程序与Red5服务器之间的交互,主要关注实时多媒体传输(RMT)技术在Web服务端的应用。Red5是一个开源流媒体服务器,能够处理视频、音频流以及数据应用。在...

    android webserver简单网页服务器

    在Android平台上实现一个简单的网页服务器是一项有趣的挑战,它允许设备作为一个小型Web服务器运行,从而能够提供本地内容或者进行一些测试。这个项目的核心是利用Android系统的网络功能来搭建一个微型HTTP服务器,...

    Android源码-服务器~

    1. **Android与服务器通信基础** - **HTTP/HTTPS协议**:Android应用通常通过HTTP或更安全的HTTPS协议与服务器进行数据交换,理解这些协议的工作原理和请求响应机制是基础。 - **网络请求库**:如Volley、OkHttp、...

    Android客户端与服务器通信+json交互数据

    综上所述,Android客户端与服务器通信并使用JSON进行数据交互是一个涉及网络编程、JSON处理、服务器框架理解等多个层面的复杂过程。在实际开发中,需要对每个环节都有深入的理解,才能有效地实现客户端与服务器的...

    Android与Javaweb服务器通信

    本示例主要探讨的是Android客户端如何通过HTTP协议与Java Web服务器进行非Socket方式的数据交换,这非常适合初学者学习和理解网络通信的基本概念。 首先,让我们了解HTTP协议。HTTP(超文本传输协议)是一种用于...

    数据通信-成为Android数据流大师

    ### 数据通信—成为Android数据流...无论是对于存储扩展、设备间的数据传输还是网络通信,都有对应的解决方案和技术支持。希望开发者们能够以此为基础,深入探索这些技术的应用,并在实际项目中发挥出它们的最大价值。

    老罗Android开发 7服务器端Web编程-有源码

    "老罗Android开发 7服务器端Web编程"课程可能涵盖了如何在Android客户端与Web服务器进行有效的数据通信,以及如何设计和实现服务器端的Web服务。这里我们将详细探讨相关知识点。 首先,Web服务器端编程通常涉及到的...

    Android手机客户端与Web服务器的通信[参照].pdf

    在Android应用开发中,手机客户端与Web服务器的通信是一个核心环节,主要依赖于HTTP协议进行数据交换。本文将深入探讨这一过程,分为客户端发送请求、服务器接收与响应、客户端提取响应数据三个部分。 1. 客户端向...

    Android-Networking-2

    这是一份对希望提升Android网络通信能力的开发者极具价值的资料。文档中强调了Android应用中的网络权限请求和基础网络操作,也提到了多种相关技术,其中包括服务器端技术和前端技术,显示了Android开发中网络编程的...

    登录web服务器jsonAndroid

    【标题】"登录web服务器jsonAndroid"涉及到的主要...综上所述,"登录web服务器jsonAndroid"涵盖了Android网络编程、JSON数据交换、服务器交互和UI设计等多个方面,对于理解和实现Android应用中的用户登录功能至关重要。

    android使用JSON进行网络数据交换(服务端、客户端)的实现

    在Android开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,被广泛应用于服务器与客户端之间的通信。本文将深入探讨如何在Android中利用JSON进行网络数据交换,包括服务端和客户端的实现。 ...

Global site tag (gtag.js) - Google Analytics