首页 > 程序开发 > 移动开发 > Android >

Android流方式发送XML数据

2011-09-06

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

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

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

2.新建一个action

Java代码

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进行相关配置

Xml代码

<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工程,并写一个工具类将数据流发送给服务器端

Java代码

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.编写一个测试类对对其进行测试

Java代码

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文件中注册访问网络权限以及单元测试所需的配置

Xml代码

<uses-permission android:name="android.permission.INTERNET"/>

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

作者“坐如松,动如风”

相关文章
最新文章
热点推荐