【问题标题】:Asynchronous HTTP Client for JavaJava 的异步 HTTP 客户端
【发布时间】:2009-06-18 18:53:43
【问题描述】:

作为 Java 世界中的新手,我发现许多其他框架中相对微不足道的事情令人沮丧地难以完成。一个主要示例是异步 http 请求的简单解决方案。看到一个似乎不存在,最好的方法是什么?使用像 httpclient 这样的阻塞类型库或内置的 java http 东西创建我自己的线程,或者我应该使用较新的非阻塞 io java 东西 - 对于应该简单的东西来说似乎特别复杂。

我正在寻找的是从开发人员的角度来看易于使用的东西 - 类似于 AS3 中的 URLLoader - 您只需创建一个 URLRequest - 附加一堆事件处理程序来处理完成、错误、进度等, 并调用一个方法来触发它。

如果你不熟悉 AS3 中的 URLLoader,它超级简单,看起来像这样:

private void getURL(String url)
{
    URLLoader loader = new URLLoader();
    loader.addEventListener(Event.Complete, completeHandler);
    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
    loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

    URLRequest request = new URLRequest(url);

    // fire it off - this is asynchronous so we handle
    // completion with event handlers
    loader.load(request);
}

private void completeHandler(Event event)
{
    URLLoader loader = (URLLoader)event.target;
    Object results = loader.data;

    // process results
}

private void httpStatusHandler(Event event)
{
    // check status code
}

private void ioErrorHandler(Event event)
{
    // handle errors
}

【问题讨论】:

    标签: java actionscript-3 http httpwebrequest


    【解决方案1】:

    使用以前称为 ning http 客户端库的“Async Http Client”。 看 https://github.com/AsyncHttpClient/async-http-client

    【讨论】:

    【解决方案2】:

    Apache Commons HttpClient 4.0 版(现在在HttpComponents/HttpCore)也支持Java 的NIO(非阻塞IO)。我认为这是你最好的选择。

    【讨论】:

      【解决方案3】:

      Jetty HTTP client 是异步的。

      【讨论】:

        【解决方案4】:

        如果您还没有看过它,请查看 Java 5 java.util.concurrent——它使多线程应用程序更易于开发。您可以设置一个管理四个线程的 ThreadPoolExecutor。然后,您可以向池提供任意数量的任务以完成。每个任务都是一个 Runnable。 ThreadPoolExecutor 将对 Runnable 任务进行排队,并将它们并行提供给可用的线程。每个 Runnable 任务完成时都会调用 Pool 的 afterExecute() 方法。

        我清楚地记得在 1999 年为一个用 Java 编写的 Web 浏览器编写了一个 fetch 线程池,它是一个。上个月,我为 Web 服务器编写了一个负载测试器。测试器有一个 ThreadPoolExecutor,它有 n 个线程,我提供给它的 Runnable 任务每个都使用 Apache HTTP 客户端获取一个页面。只花了一两个小时就让它工作得相当好。我认为您会喜欢 java.util.concurrent 与 Apache HTTP 客户端相结合,但听起来您需要对进度指示进行一些自定义。

        (请注意,Apache HTTP 客户端有自己的线程池,默认配置将您限制为最多 20 个线程,并且每个 Web 服务器只有两个。)

        更新:这是Apache HTTP Client 的链接。请务必阅读MultiThreadedHttpConnectionManager,它负责处理连接池,并且在最基本的示例中没有显示。

        【讨论】:

        • 很好的信息。谢谢。我仍然无法相信 Java 对客户端的不友好程度。也许 Java 才刚刚开始显示它的年龄。
        • 在 1.4 和 Java 5 年期间,我几乎没有进行过 Java 开发,现在我发现 Java 6 明显优于 1.3。除了 java.util.concurrent,泛型和 Collections 框架也很突出。不过,Java 上的分层技术似乎并不友好:将 JAXP 与 Groovy 的简洁 XML 处理进行比较。还。如今,Ruby、Python 和 Scala 等动态语言竞争激烈。
        • 不,不是Java显老;查看多个非 JDK 捆绑的非阻塞(异步)http 客户端。无需为了进行并发访问而显式地弄乱线程。虽然在 JDK 中使用非阻塞替代方案会很方便,但有很多有用的东西,最好尽量避免 JDK 膨胀得更大。
        【解决方案5】:

        看起来你想要(一部分)NIO——有一个很好的教程here,异步网络部分从 p 开始。 30,最后有很多有用的链接。

        【讨论】:

          【解决方案6】:

          在 NIO/Netty 之上编写了一些库和框架 - RxNettyVertx 有助于编写异步 HTTP 客户端

          下面是使用vertx的示例代码

          public class Client extends AbstractVerticle {
          
            @Override
            public void start() throws Exception {
              //lambda callback would be called when the response comes back
              vertx.createHttpClient().getNow(8080, "localhost", "/", resp -> {
                System.out.println("Got response " + resp.statusCode());
                resp.bodyHandler(body -> {
                  System.out.println("Got data " + body.toString("ISO-8859-1"));
                });
              });
             //this code statement will execute before response comes back
             System.out.println("I am not blocked");
            }
          }
          

          你可以从here找到完整的示例代码

          【讨论】:

            【解决方案7】:

            因此,可能值得考虑的是 actionscript 和 Java 不服务于相同的利基市场。例如,Java 确实让一些事情变得更加乏味 - 但通常是为用户提供更多选项,例如如何执行 HTTP 连接,而 actionscript 可能会抽象出细节或可能的错误以方便使用。但是,你的观点仍然成立。

            我自己不知道用于 Java 的异步 HTTP 客户端。 Alex Martelli 的回答谈到了 Java 的 NIO,如果您有兴趣在自己的代码中实现 HTTP 协议,这是一个很好的回答。 NIO 将允许您使用套接字连接到 Web 服务器 - 但是您必须手动创建自己的 GET 请求并解析传入的 HTTP 标头/数据。

            另一种选择是使用 java.net.URL 类 - 您可以在网上和 stackoverflow 上找到许多教程。您可以将它们包装在线程中 - 这样您的 java 程序就有多个执行线程。

            但是你遇到了同步问题。我同意,这很痛苦,但它提供了更细粒度的灵活性。

            (我意识到这并不能回答您的问题 - 如果有人真的知道 java 工具来执行异步 http 请求,我很想知道!)

            【讨论】:

            • 完全了解不同的利基市场。但是,在本例中,我们使用 Java 作为客户端 UI 框架,并且要呈现的大量数据来自外部 Web 服务。
            • 实际上有多个异步 http 客户端,在其他答案中列出(jetty 有一个多年,jakarta hc 也有一段时间;ning 的异步 http 客户端是最新的并且正在积极开发)。他们只是没有得到应有的足够关注。
            【解决方案8】:

            httpunithtmlunit 是 2 个可自定义和可配置的 Java http 客户端,可以使用任何浏览器,例如模拟 firefox、无头浏览、预定的软件客户端和代理。

            【讨论】:

            • 我正要提到这一点,但这些都不是异步的。不过,它们确实可以快速完成自动化任务。
            【解决方案9】:

            还可以查看http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html 本文讨论基于名为 xLightweb 的 HttpClient 的异步 HTTP

            【讨论】:

              【解决方案10】:

              AFAIK TCPMon 工具采用与您描述的方法类似的方法。你可以看看他们SVN browser的源代码

              还可以查看 WGET-java 了解阻塞代码的内容。

              但是你必须用 Java 写这个吗?还有很多其他方法使用 JRuby 或 Rhino 来轻松完成类似的事情,这些方法可以在 JVM 上运行,但不是用 Java 编写的。

              【讨论】:

              • 嗯,使用其他语言编译成 java 字节码是未来的选择,但我们肯定也需要基于 Java 的东西。感谢您的建议。
              【解决方案11】:

              我建议为此触发单独的线程。

              【讨论】:

              • 即使我触发了分离的线程,我仍然觉得线程阻塞并且没有我预期的那么快......
              【解决方案12】:

              我刚刚偶然发现了在 Geronimo 中实现的异步 HTTP 客户端。您可能还想看看它,http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ - 警告:最新的提交似乎已经有一年多了。

              另一个构建异步HTTP客户端的项目是xsocket:xsocket.sourceforge.net

              【讨论】:

              【解决方案13】:

              Asyncweb 提供了一个异步 http 客户端及其 http 服务器。可从以下位置下载:

              https://svn.apache.org/repos/asf/mina/asyncweb/trunk

              【讨论】:

                猜你喜欢
                • 2019-01-25
                • 2017-12-15
                • 2017-08-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-03-31
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多