簡體   English   中英

將大量數據從 servlet 傳輸到 android 應用程序

[英]Transfer huge data from servlet to android application

我正在開發一個 android 應用程序,我必須在遠程服務器中存儲一個 bitmap 應用程序。 步驟是:

第 1 步:將 bitmap 轉換為字節數組並將其從 android 應用程序發送到服務器。我將 bitmap 作為 MultipartEntity(在服務器端)發送。我在服務器端接收它。

第2步:將字節數組存儲在mysql數據庫中。Bitmap存儲為blob數據類型。我能夠將接收到的字節數組存儲到mysql數據庫中。

第 3 步:檢索存儲為 blob 的 bitmap 並將其發送回 android 應用程序。我能夠檢索 blob 並轉換為字節數組並發送它。

我的問題

問題是從服務器發送的數據是小批量接收的。圖像長度為 1380,但以 10's、50's、100's 的可變長度接收。當我將總數加起來時,我只得到 1345,缺少幾個字節的數據.我在接收端發布代碼。

URL url = new URL( "http://10.0.2.2:8080/ServerPartProject/BlobGetter");
 URLConnection yc = url.openConnection();              
 BufferedReader in = new BufferedReader(new       InputStreamReader(yc.getInputStream()));                                                      String data;
 int val=0; 
 while((data=in.readLine())!=null){
    val=val+data.length();  //The data.length is like 10,20..
 }
 System.out.println("Total value obtained is "+val);//val was 1345 where it should be 1380

發送端:

OutputStreamWriter writer = new OutputStreamWriter(response.getOutputStream());
writer.write(senddata);

如何全面接收?

您可以使用 JSON。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    List<String> list = new ArrayList<String>();
    list.add("item1");
    list.add("item2");
    list.add("item3");
    String json = new Gson().toJson(list);

    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
}

這將以以下 JSON 格式構建並返回List

["item1","item2","item3"]

這又可由org.json中的 org.json API 解析,如下所示:

String jsonString = getServletResponseAsStringSomehow(); // HttpClient?
JSONArray jsonArray = new JSONArray(jsonString);
List<String> list = new ArrayList<String>();

for (int i = 0; i < jsonArray.length(); i++) {
    list.add(jsonArray.getString(i));
}

// Now you can use `list`.

不要使用readLine() 您正在處理原始數據。 原始數據沒有行,只有文本才有。

您的某些字節可能已轉換為 2 字節 unicode 字符,這解釋了您感知到的數據丟失。

我會避免使用面向字符的讀取器和寫入器來發送和接收圖像數據(大概是二進制的[如果你是 base64 編碼或其他東西,你沒有提到,忽略這個])。 字節被解釋為字符,轉換回字節,然后再次被解釋為字符,最后返回字節; 在此過程中,圖像數據被破壞。 使用 Http 對象提供的 InputStream/OutputStream 接口,而不是在它們上面放置 Readers 和 Writers。

您正在使用 readLine() 讀取字節數據,如果不是問題的話,這至少很奇怪。 在您的示例代碼中,您沒有關閉您的閱讀器(應該是 InputStreams)。 緩沖輸入可能會在緩沖區中留下一些字節,這些字節在刷新或關閉之前不會被讀取。

希望這可以幫助。

If your database resides locally and not in the internet cloud, you can access it directly via JDBC API with JDBC connector mysql-connector-java-3.0.17-ga-bin.jar. 不是說您不能遠程訪問您的數據庫,而是直接在雲中公開您的數據庫是非常不明智和冒險的。

要在 Android 中將 blob 讀取到 bmp,可以使用 BitmapFactory,如下所示:

// this is a snippet of course..

try
{
  Class.forName("com.mysql.jdbc.Driver");
  String astring = "jdbc:mysql://localhost:3306/mydb?user=root&password=pass"; 
  Connection ac = DriverManager. getConnection(astring);
  Statement st = ac.GetStatement();
  astring = "SELECT MYBLOB FROM MYTABLE";  // create your query here
  ResultSet rs = st.executeQuery(astring)

  if(rs.next())
  {
     java.sql.Blob ablob = rs.getBlob("MYBLOB");
     Bitmap bmp = BitmapFactory.decodeStream(ablob.getBinaryStream());

     // here you have your bmp, do whatever you want
     UseBmp(bmp);
  }

}
catch(Exception e)
{
  e.printStackTrace();
}

您需要實現一個連接池來加快查詢響應時間,因為 JDBC 在建立與服務器的連接時給 Android 帶來了一點開銷,啟動需要 2 到 3 秒,但一旦連接工作速度非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM