Android流方式發送XML資料

來源:互聯網
上載者:User

 

我們可以採用請求參數的形式向伺服器發送資料,但是當資料太大時,此方法不可用,此時我們應該採用流的方式發送資料,下面這個例子是將一個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項目運行起來,然後運行單元測試類,我們看到伺服器端列印出了用戶端傳送過來的資料

作者“坐如松,動如風”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.