我正在看通過http從android客戶端發送對象到我的服務器運行java servlets。該對象可以容納一個位圖圖像,我只是想知道是否可以向我展示一個從客戶端向服務器發送對象的示例。如何從android發送對象到servlet?
我在人們說使用JSON的表單上閱讀,但在我看來,JSON只能處理文本數據。如果它不能讓我告訴我如何將它與包含圖像的對象一起使用
我正在看通過http從android客戶端發送對象到我的服務器運行java servlets。該對象可以容納一個位圖圖像,我只是想知道是否可以向我展示一個從客戶端向服務器發送對象的示例。如何從android發送對象到servlet?
我在人們說使用JSON的表單上閱讀,但在我看來,JSON只能處理文本數據。如果它不能讓我告訴我如何將它與包含圖像的對象一起使用
要在Java客戶端和通過HTTP連接的Java服務器之間發送二進制數據,基本上有2個選項。
序列化,即讓對象實現Serializable
,對雙方.class
文件的精確副本,並通過ObjectInputStream
發送和ObjectInputStream
閱讀。優點:可笑容易。缺點:向後兼容性差(當您更改對象以添加新字段時,必須編寫極其多的代碼和檢查以確保向後兼容性)和糟糕的可重用性(不能在其他客戶端/服務器上重用,而不是Java可重用) 。使用HTTP multipart/form-data
。 Advandage:非常兼容(Web標準)和非常好的可重用性(服務器可在其他客戶端重用,客戶端可在其他服務器上重用)。缺點:難以實現(幸運的是有API和庫)。在Android中,您可以使用內置的HttpClient
API發送它。在Servlet中,您可以使用Apache Commons FileUpload來解析它。
我建議你使用的XStream
XStream的爲你的servlet方:針對Android優化 http://x-stream.github.io/tutorial.html
XStream的代碼: http://jars.de/java/android-xml-serialization-with-xstream
如果要發送的圖像和這樣的,他們包裝轉換爲包含像這樣的字節數組的'信封'類:Serializing and De-Serializing android.graphics.Bitmap in Java
然後使用HttpClient的在你的Android應用程序將數據發送到你的servlet^^ 同時確保這兩個應用程序,並在servlet具有相同的類^^
的Socket API也很好。 在兩側創建套接字將允許發送原始數據從客戶端android應用程序傳輸到服務器。
對於HTTP連接,我不會爲'Socket'做低級別的事情。 1行代碼比100行代碼更容易。 – BalusC 2012-02-07 14:29:13
這裏是打一個servlet併發送數據到服務器的代碼。
boolean hitServlet(final Context context, final String data1,final String data2) {
String serverUrl = SERVER_URL + "/YourSevletName";
Map<String, String> params = new HashMap<String, String>();
params.put("data1", data1);
params.put("data2" data2)
long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000);
// As the server might be down, we will retry it a couple
// times.
for (int i = 1; i <= MAX_ATTEMPTS; i++) {
try {
post(serverUrl, params);
return true;
} catch (IOException e) {
// Here we are simplifying and retrying on any error; in a real
// application, it should retry only on unrecoverable errors
// (like HTTP error code 503).
Log.e(TAG, "Failed " + i, e);
if (i == MAX_ATTEMPTS) {
break;
}
try {
Log.d(TAG, "Sleeping for " + backoff + " ms before retry");
Thread.sleep(backoff);
} catch (InterruptedException e1) {
// Activity finished before we complete - exit.
Log.d(TAG, "Thread interrupted: abort remaining retries!");
Thread.currentThread().interrupt();
return false;
}
// increase backoff exponentially
backoff *= 2;
}
}
return false;
}
關於序列化對象的向後兼容性:總是定義'serialVersionUID'將會有所幫助,無論如何這是個好習慣。此外,避免序列化的常見缺陷(例如J. Bloch的_Effective Java_的第11章)應該讓你更安全。 – 2014-01-14 12:37:32