[英]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.