如何将对象从android发送到servlet?

时间:2011-06-13 11:26:06

标签: java json servlets jsonp

我正在寻找通过http从android客户端发送到运行java servlets的服务器的对象。该对象可以保存位图图像,我只是想知道您是否可以向我展示一个从客户端向服务器发送对象的示例。

我读过人们说要使用JSON的表单,但在我看来,JSON只使用文本数据。如果没有,有人可以告诉我如何使用包含图像的对象

4 个答案:

答案 0 :(得分:2)

要在Java客户端和通过HTTP连接的Java服务器之间发送二进制数据,基本上有2个选项。

  1. 序列化它,即让对象实现Serializable,在两边都有.class文件的精确副本,然后通过ObjectInputStream发送,并按{{1}读取}}。优点:非常容易。缺点:向后兼容性差(当您更改对象以添加新字段时,您需要编写大量额外代码并进行检查以确保向后兼容性)和可重用性差(在Java之外的其他客户端/服务器上不可重用)

  2. 使用HTTP ObjectInputStream。 Advandage:非常兼容(Web标准)和非常好的可重用性(服务器可以在其他客户端上重用,客户端可以在其他服务器上重用)。缺点:难以实现(幸运的是,有这样的API和库)。在Android中,您可以使用内置HttpClient API发送它。在Servlet中,您可以使用Apache Commons FileUpload来解析它。

答案 1 :(得分:1)

我建议你使用XStream

您的servlet端的XStream: http://x-stream.github.io/tutorial.html

针对Android优化的XStream代码: http://jars.de/java/android-xml-serialization-with-xstream

如果您要发送图像等,请将它们包装到一个“信封”类中,该类包含类似于此处的字节数组:Serializing and De-Serializing android.graphics.Bitmap in Java

然后在Android应用程序中使用HttpClient将数据发送到您的servlet ^ ^同时确保app和servlet具有相同的类^ ^

答案 2 :(得分:0)

Socket Api也很好。 在两侧创建套接字将允许发送原始数据从客户端android应用程序传输到服务器。

答案 3 :(得分:0)

以下是命中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;
}