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完成。