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