程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Android運用HttpURLConnection經過POST方式發送java序列化對象

Android運用HttpURLConnection經過POST方式發送java序列化對象

編輯:關於JAVA

Android運用HttpURLConnection經過POST方式發送java序列化對象。本站提示廣大學習愛好者:(Android運用HttpURLConnection經過POST方式發送java序列化對象)文章只能為提供參考,不一定能成為您想要的結果。以下是Android運用HttpURLConnection經過POST方式發送java序列化對象正文


運用HttpURLConnection類不只可以向WebService發送字符串,還可以發送序列化的java對象,完成Android手機和服務器之間的數據交互。

Android端代碼:

 1     public String SendDataByPost(String urlStr){
 2         URL url = null;
 3         String result="";//要前往的後果
 4         try {
 5             url=new URL(urlStr);
 6             HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
 7 
 8             httpURLConnection.setConnectTimeout(2000);//設置銜接超時時間,單位ms
 9             httpURLConnection.setReadTimeout(2000);//設置讀取超時時間,單位ms
10 
11             //設置能否向httpURLConnection輸入,由於post懇求參數要放在http注釋內,所以要設置為true
12             httpURLConnection.setDoOutput(true);
13 
14             //設置能否從httpURLConnection讀入,默許是false
15             httpURLConnection.setDoInput(true);
16 
17             //POST懇求不能用緩存,設置為false
18             httpURLConnection.setUseCaches(false);
19 
20             //傳送的內容是可序列化的
21             //假如不設置此項,傳送序列化對象時,當WEB服務默許的不是這品種型時,會拋出java.io.EOFException錯誤
22             httpURLConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
23 
24             //設置懇求辦法是POST
25             httpURLConnection.setRequestMethod("POST");
26 
27             //銜接服務器
28             httpURLConnection.connect();
29 
30             //getOutputStream會隱含調用connect(),所以不必寫上述的httpURLConnection.connect()也行。
31             //失掉httpURLConnection的輸入流
32             OutputStream os= httpURLConnection.getOutputStream();
33 
34             //構建輸入流對象,以完成輸入序列化的對象
35             ObjectOutputStream objOut=new ObjectOutputStream(os);
36 
37             //dataPost類是自定義的數據交互對象,只要兩個成員變量
38             dataPost data= new dataPost("Tom",null);
39 
40             //向對象輸入流寫出數據,這些數據將存到內存緩沖區中
41             objOut.writeObject(data);
42 
43             //刷新對象輸入流,將字節全部寫入輸入流中
44             objOut.flush();
45 
46             //封閉流對象
47             objOut.close();
48             os.close();
49 
50             //將內存緩沖區中封裝好的完好的HTTP懇求電文發送到服務端,並獲取訪問形態
51             if(HttpURLConnection.HTTP_OK==httpURLConnection.getResponseCode()){
52 
53                 //失掉httpURLConnection的輸出流,這外面包括服務器前往來的java對象
54                 InputStream in=httpURLConnection.getInputStream();
55 
56                 //構建對象輸出流,運用readObject()辦法取出輸出流中的java對象
57                 ObjectInputStream inObj=new ObjectInputStream(in);
58                 data= (dataPost) inObj.readObject();
59 
60                 //取出對象外面的數據
61                 result=data.password;
62 
63                 //輸入日志,在控制台可以看到接納到的數據
64                 Log.w("HTTP",result+"  :by post");
65 
66                 //封閉創立的流
67                 in.close();
68                 inObj.close();
69             }else{
70                 Log.w("HTTP","Connction failed"+httpURLConnection.getResponseCode());
71             }
72         } catch (Exception e) {
73             e.printStackTrace();
74         }
75         return result;
76     }
 1 package com.example.com.example.data;
 2 
 3 import java.io.Serializable;
 4 
 5 //完成Serializable接口,使dataPost可序列化。
 6 public class dataPost implements Serializable {
 7     
 8     /*指定序列化版本號,保證序列化版本的分歧性。在服務器端,JVM會把傳來的字節流的
 9     serialVersionUID與本地相應實體(類)的serialVersionUID停止比擬,假如相反就認
10     為是分歧的,可以停止反序列化,否則就會呈現序列化版本不分歧的異常。*/
11     private static final long serialVersionUID = 1L;
12 
13     String name;
14     String password;
15     public dataPost(String name, String password) {
16         this.name = name;
17         this.password = password;
18     }
19 
20     public String getName() {
21         return name;
22     }
23 
24     public void setName(String name) {
25         this.name = name;
26     }
27 
28     public String getPassword() {
29         return password;
30     }
31 
32     public void setPassword(String password) {
33         this.password = password;
34     }
35     
36 }

 服務端順序:

 1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         
 3         ServletInputStream in=request.getInputStream();
 4         dataPost datap = null;
 5         ObjectInputStream obj=new ObjectInputStream(in);
 6         try {
 7             datap= (dataPost) obj.readObject();
 8         } catch (ClassNotFoundException e) {
 9             e.printStackTrace();
10         }finally{
11             obj.close();
12             in.close();
13         }                
14         response.setContentType("application/x-java-serialized-object");
15         OutputStream out=response.getOutputStream();
16         ObjectOutputStream outObj=new ObjectOutputStream(out);
17         datap.setPassword("9964646");
18         outObj.writeObject(datap);
19         outObj.flush();
20         outObj.close();
21     }

留意事項:

1,客戶端url假如有中文會呈現亂碼,需求對url停止編碼。

例如:

1 String url="你好";
2 URI uri=new URI(url,false,"utf-8");
3 url=uri.toString();

2,在Android主順序中調用SendDataByPost()辦法時,要重新開一個線程,否則會阻塞主線程。

3,Android端dataPost類的包名和server端dataPost的包名必需分歧,否則就會呈現找不到該類的異常。

例如:java.lang.ClassNotFoundException: com.example.com.example.data.dataPost

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)

4,Android端dataPost類的包名和server端dataPost的序列化版本必需分歧,否則會報出serialVersionUID不同的錯誤。

Servlet.service() for servlet [com.test.stream.testStream] in context with path [/campus2] threw exception

java.io.InvalidClassException: com.example.com.example.data.dataPost; local class incompatible: stream classdesc serialVersionUID = -1197271749879367300, local class serialVersionUID = -3085829960977977003

只需求在兩端的dataPost類中顯式的指定序列化版本號,經過添加private static final long serialVersionUID = 1L完成。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved