对Java的异步HTTP客户端对Java的异步HTTP客户端(Asynchronous HTTP C

2019-05-13 12:40发布

由于在Java世界相对的新手,我发现很多事情令人沮丧钝来实现这一目标在许多其他框架比较琐碎。 一个主要的例子是用于异步http请求的简单解决方案。 看到作为一个似乎不存在,什么是最好的方法呢? 使用阻塞式的lib像的HttpClient或创建自己的线程内置的Java HTTP的东西,或者我应该使用较新的非阻塞IO java的东西 - 它似乎特别复杂的东西,这应该是简单的。

我所寻找的东西很容易从一个开发者角度使用 - 在AS3类似的东西来的URLLoader - 您只需创建一个URLRequest - 附加一堆事件处理程序来处理完成,错误,进步等,并调用一种方法来启动它关闭。

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

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
}

Answer 1:

使用“异步HTTP客户端”原名宁HTTP客户端库。 见http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

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



Answer 2:

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



Answer 3:

如果你还没有看着它了,检查了Java 5的java.util.concurrent中 - 它使多线程应用程序更易于开发。 您可以设置管理,也就是说,四个线程的ThreadPoolExecutor。 然后,喂养池任意数量的任务来完成。 每个任务是一个Runnable。 该ThreadPoolExecutor的将排队了Runnable任务和并行喂它们可用线程。 每个Runnable任务完成时池的afterExecute()方法被调用。

我清楚地记得写一个获取线程池用Java编写的早在1999年网络浏览器,它是一只获得的权利。 上个月,我写了一个负载测试的Web服务器。 该测试仪具有有n个线程的ThreadPoolExecutor和的Runnable任务我给它的每个使用Apache HTTP客户端获取一个网页。 仅仅过了一两个小时得到它的工作还算不错。 我想你会喜欢的java.util.concurrent加上Apache的HTTP客户端,但它听起来像你需要做一些定制的进步迹象。

(注意:Apache的HTTP客户端执行其自己的线程池,默认配置限制你到20个线程最高,只有两到每个Web服务器。)

更新:这里的链接Apache的HTTP客户端 。 请务必在阅读了MultiThreadedHttpConnectionManager ,这就是处理连接池,它不是在最基本的例子所示。



Answer 4:

看起来你想(的一部分)NIO -有一个很好的教程在这里 ,异步联网的部分开始在页。 30并有在年底许多有用的链接。



Answer 5:

的码头HTTP客户端是异步的。



Answer 6:

有写在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");
  }
}

你可以找到完全成熟的示例代码这里



Answer 7:

因此,它可能是值得考虑的动作和Java不服务器相同的利基。 例如Java确实使一些事情比较繁琐的 - 但通常是给用户如何,例如,执行一个HTTP连接更多的选择,而动作的威力抽象的细节或可能出现的错误离开了易用性。 但是,你的观点仍然有效。

我本人不知道对Java的异步HTTP客户端。 亚历克斯·马尔泰利的关于Java的NIO,这是如果你有兴趣在执行自己的代码的HTTP协议的一个很好的答案的答案会谈。 NIO将让你使用套接字连接到Web服务器 - 但你必须手动创建自己的GET请求并解析传入的HTTP头/数据。

另一种选择是使用的java.net.URL类 - 你可以找到那些网上和计算器很多教程。 你可以用那些线程 - 让你的Java程序具有多线程执行。

但后来你遇到的同步问题。 这我同意,是一种痛苦,但后来它提供的灵活性,更细化的级别。

(我知道这不回答你的问题 - 如果有人确实知道一个java设施做异步HTTP请求,我会有兴趣知道!)



Answer 8:

AFAIK的TCPMon的工具采用类似的方法,以你的描述。 你可以看看源代码,在他们的SVN浏览器

也看看WGET的Java的代码阻塞的胆量。

但你必须用Java写的吗? 有很多的使用JRuby或犀牛来完成这样的事情很容易将运行在JVM上,但Java是不写的其他方法。



Answer 9:

httpunit的和的HtmlUnit 2个可定制和配置的Java HTTP客户端能够任何一个浏览器,如Firefox的模拟,无头的浏览,定软件的客户和代理商。



Answer 10:

也看看到http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html本文讨论基于一个名为的HttpClient异步xLightweb HTTP



Answer 11:

我建议你射击该独立的线程。



Answer 12:

我只是偶然在Geronimo实现异步HTTP客户端。 你可能也想看看它在http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ -警告:最新的承诺似乎一岁多。

另一个项目建设一个异步HTTP客户端了xSocket:xsocket.sourceforge.net



Answer 13:

Asyncweb提供了一个异步HTTP客户端提供的HTTP服务器一起。 可从以下网站下载:

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



文章来源: Asynchronous HTTP Client for Java