Java的异步HTTP客户端

作为Java世界中的一个相对新手,我发现很多事情令人沮丧地完成,在许多其他框架中相对微不足道。 一个主要的例子是异步http请求的简单解决方案。 看起来似乎并不存在,最好的方法是什么? 使用像httpclient这样的阻塞类型lib或者内置的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 } 

使用以前称为ning http客户端库的“Async Http Client”。 见http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

现在可以在GitHub上获得https://github.com/ning/async-http-client

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

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

我清楚地记得1999年用Java编写的Web浏览器编写了一个fetch线程池,这是一个很好的做法。 上个月我为Web服务器编写了一个负载测试器。 测试人员有一个ThreadPoolExecutor,它有n个线程,我提供的Runnable任务每个都使用Apache HTTP Client获取一个页面。 只花了一两个小时就让它运转得相当好。 我想你会喜欢java.util.concurrent和Apache HTTP Client,虽然听起来你需要为进度指示做一些自定义。

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

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

看起来你想(NIO的一部分) – 这里有一个很好的教程,异步网络部分从p开始。 30并且最后有许多有用的链接。

Jetty HTTP客户端是异步的。

在NIO / Netty – RxNetty和Vertx之上编写的库和框架可以帮助编写异步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"); } } 

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

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

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

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

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

(我意识到这没有回答你的问题 – 如果有人真的知道java工具做异步http请求,我有兴趣知道!)

AFAIK TCPMon工具采用与您描述的方法类似的方法。 您可以在SVN浏览器中查看源代码

还要看一下WGET-java的阻塞代码。

但是你必须用Java写这个吗? 使用JRuby或Rhino很多其他方法可以轻松地完成这样的操作,这些方法将在JVM上运行,但不是用Java编写的。

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

另请参阅http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html本文讨论基于名为xLightweb的HttpClient的异步HTTP

我建议为此启动单独的线程。

我只是偶然发现了Geronimo中实现的异步HTTP客户端。 您可能还想查看它,请访问http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ – 警告:最新的提交似乎超过一年。

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

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

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