Android流方式发送XML数据

我们可以采用请求参数的形式向服务器发送数据,但是当数据太大时,此方法不可用,此时我们应该采用流的方式发送数据,下面这个例子是将一个xml文件的内容以字节流的形式发送给服务器。

1、新建一个web项目,由于我使用了struts2,需要引入相关的jar包并配置相应的环境

2、新建一个action

package com.lamp.action;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

public class XMLDataAction {

	// 通过输入流获得字节数组
	public static byte[] readStream(InputStream is) throws Exception {
		byte[] buffer = new byte[1024];
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		int len = 0;
		while ((len = is.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		is.close();
		return bos.toByteArray();
	}

	public String execute() throws Exception {
		// 获得HttpServletRequest对象
		HttpServletRequest request = ServletActionContext.getRequest();
		// 从客户端获得输入流
		InputStream is = request.getInputStream();
		byte[] data = readStream(is);
		String str = new String(data, "UTF-8");
		if (str != null) {
			System.out.println(str);
			return "success";
		}
		return "error";
	}
}

3、在struts.xml中对action进行相关配置

4、新建一个Android工程,并写一个工具类将数据流发送给服务器端

package com.lamp.util;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class NetTool {

	// 以流方式向服务器端发送xml文件数据,并获得服务器端输出流
	public static InputStream sendXMLData(String urlPath, byte[] data,
			String encoding) throws Exception {
		URL url = new URL(urlPath);
		// 打开连接
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// 设置提交方式
		conn.setDoOutput(true);
		conn.setDoInput(true);
		conn.setRequestMethod("POST");
		// post方式不能使用缓存
		conn.setUseCaches(false);
		conn.setInstanceFollowRedirects(true);
		// 设置连接超时时间
		conn.setConnectTimeout(6 * 1000);
		// 配置本次连接的Content-Type
		conn.setRequestProperty("Content-Type", "text/html;charset=UTF-8");
		// 维持长连接
		conn.setRequestProperty("Connection", "Keep-Alive");
		// 设置浏览器编码
		conn.setRequestProperty("Charset", "UTF-8");
		DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
		// 将请求参数数据向服务器端发送
		dos.write(data);
		dos.flush();
		dos.close();
		if (conn.getResponseCode() == 200) {
			// 获得服务器端输出流
			return conn.getInputStream();
		}
		return null;
	}

	// 通过输入流获得字节数组
	public static byte[] readStream(InputStream is) throws Exception {
		byte[] buffer = new byte[1024];
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		int len = 0;
		while ((len = is.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		is.close();
		return bos.toByteArray();
	}

}

5、编写一个测试类对对其进行测试

package com.lamp.activity;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import android.os.Environment;
import android.test.AndroidTestCase;
import android.util.Log;

import com.lamp.util.NetTool;

public class TestPostData extends AndroidTestCase {
	private static final String TAG = "TestPostData";

	// 以流的方式向服务器发送数据
	public void testSendXML() throws Exception {
		String urlPath = "http://ip地址:8080/TestAndroid/XMLData";
		// 从sdk卡中读取persons.xml文件
		File file = new File(Environment.getExternalStorageDirectory(),
				"persons.xml");
		InputStream is = new FileInputStream(file);
		byte[] data = NetTool.readStream(is);
		is = NetTool.sendXMLData(urlPath, data, "UTF-8");
		data = NetTool.readStream(is);
		Log.i(TAG, new String(data));
	}
}

6、记得要在AndroidManifest.xml文件中注册访问网络权限以及单元测试所需的配置

最后将web项目运行起来,然后运行单元测试类,我们看到服务器端打印出了客户端传送过来的数据。

暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章
推荐文章
随机文章
关于本站 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图 - 帮助中心