`
liaokang.java
  • 浏览: 152070 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Android 流方式发送XML数据

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

1.新建一个web项目,由于我使用了struts2,需要引入相关的jar包并配置相应的环境,可参考博文另一篇博文 Android POST方式提交数据http://liaokang-java.iteye.com/blog/1166083

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进行相关配置
  <package name="lamp" extends="struts-default">        
        <action name="XMLData" class="com.lamp.action.XMLDataAction">
        	<result name="success">/WEB-INF/page/success.jsp</result>
        	<result name="error">/WEB-INF/page/error.jsp</result>
        </action>
    </package>


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文件中注册访问网络权限以及单元测试所需的配置
<uses-permission android:name="android.permission.INTERNET"/> 


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

相关推荐

    Android流方式发送XML数据

    Android流方式发送XML数据

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Google Android SDK开发范例大全(完整版)

    开始开发 Android 应用程序的最简捷的方式是下载 Android SDK 和 Eclipse IDE(参见 参考资料)。Android 开发可以在 Microsoft® Windows®、Mac OS X 或 Linux 上进行。 本文假设您使用的是 Eclipse IDE 和用于 ...

    精通ANDROID 3(中文版)1/2

    24.4.1 设置音频流  24.4.2 使用耳标  24.4.3 播放静音  24.4.4 选择不同的文本到语音转换引擎  24.4.5 使用语言方法  24.5 参考资料  24.6 小结  第25章 触摸屏  25.1 MotionEvent  25.1.1 ...

    疯狂Android讲义源码

     第8章 Android的数据存储和IO 306  8.1 使用SharedPreferences 307  8.1.1 SharedPreferences与Editor  简介 307  8.1.2 SharedPreferences的存储  位置和格式 308  8.1.3 读、写其他应用Shared  ...

    精通Android 3 (中文版)2/2

    第1章 Android计算平台简介  1.1 面向新PC的全新平台  1.2 Android的历史  1.3 Dalvik VM剖析  1.4 理解Android软件栈  1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 ...

    android知识大总结【邯院】

    第1章 布局方式 3 第2章 对话框 11 第3章 硬件菜单 17 第4章 输入选择组件 19 第5章 图片和按钮 30 第6章 日期和时间控件 34 第7章 进度条和滑动条 37 第8章 GridView和Gallery控件 43 第9章 AutoCompleteTextView...

    疯狂Android讲义.part2

    第8章 Android的数据存储和IO 306 8.1 使用SharedPreferences 307 8.1.1 SharedPreferences与Editor 简介 307 8.1.2 SharedPreferences的存储 位置和格式 308 8.1.3 读、写其他应用Shared Preferences 310 8.2 File...

    疯狂Android讲义.part1

    第8章 Android的数据存储和IO 306 8.1 使用SharedPreferences 307 8.1.1 SharedPreferences与Editor 简介 307 8.1.2 SharedPreferences的存储 位置和格式 308 8.1.3 读、写其他应用Shared Preferences 310 8.2 File...

    Android开发资料合集--续

    比之前的合集更丰富详细的...向Internet发送数据 143 99、Jason解析 146 100、广播 147 101、SQLite清空数据库 147 102、反射机制 148 103、JS 148 104、TextView多行末尾显示省略号 148 105、竖直显示的textView 153

    SipDroid客户端源码

    最好的实现该软件的方法是,借助Android的MediaRecorder实时提取出H263/H264数据,然后经过RTP封装传给RTSP服务器,这种实现方式最理想,通过获取onPrewFrame来获取预览帧编码,无论怎么弄,不可避免的,延时,丢帧...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...

    基于android的即时通讯开题报告(2.0).doc

    当前的手机操作系统都过于封闭,各大聊天系统软件采用的通讯协 " "议也不统一,而Android是基于Linux的开源的手机操作系统平台,XMPP是基于XML的" "开源的即时通讯协议,因此基于Android平台和XMPP协议开发聊天系统...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java开源包1

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包11

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包2

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

Global site tag (gtag.js) - Google Analytics