支持并发的http客户端(基于tcp连接池以及netty)

闲来无事,将以前自己写的一个库放出来吧。。

有的时候会有这样子的需求:

(1)服务器A通过HTTP协议来访问服务器B

(2)服务器A可能会并发的像B发送很多HTTP请求

类似于上述的需求,可能并不常见。。。因为在业务中确实遇到了这样子的场景,所以就自己动手开发了一个库。。。

实现原理:

(1)底层IO通过netty搞

(2)维护一个tcp的长连接池,这样子就不用每次发送请求还要建立一个tcp连接了。。。

下面直接来看怎么用吧:

(1)最常规的用法,向www.baidu.com发送100次get请求:

ClientPool pool = new NettyClientPool(2, "www.baidu.com");
        pool.start();
        for (int i = 0; i < 100; i++) {
            Request re = new Request("/", Request.RequestMethod.GET);
            pool.request(re).addListener(new Future.Listener() {
                @Override
                public void complete(Object arg) {
                    Response res = (Response)arg;
                    System.out.println(res.getBody().toString(Charset.forName("utf-8")));
                }

                @Override
                public void exception(Throwable t) {

                }
            });
        }

这里可以看到,其实这里是异步的提交的,所以需要注册一些回调。。。

(2)使用同步的方式发送请求,这里就弄成Post请求吧:

        ClientPool pool = new NettyClientPool(2, "www.baidu.com");
        pool.start();
        Request re = new Request("/", Request.RequestMethod.POST);
        re.getBody().writeBytes("aaaa".getBytes(Charset.forName("utf-8")));
        try {
            Response response = pool.requestWithTimeOut(re, 2000).sync();
            System.out.println(response.getBody().toString(Charset.forName("utf-8")));
        } catch (Throwable throwable) {
            System.out.println(throwable);
        }
        pool.stop();

这里可以看到,提交请求的时候还带有超时的额,也就是2000毫秒都还没有搞完,那么就不搞了。。

好了,就介绍这些吧,反正post和get请求都有,支持超时控制。。。

支持并发。。。至于说性能嘛。。。应该不差吧,也不知道该跟谁比较。。。。

最后给出github地址吧:

https://github.com/2225377fjs/HttpClientPool

点击打开链接

支持并发的http客户端(基于tcp连接池以及netty),布布扣,bubuko.com

时间: 2024-08-04 21:02:38

支持并发的http客户端(基于tcp连接池以及netty)的相关文章

用C#实现TCP连接池

背景 最近对接一个TCP协议,这个协议定义的非常好,有头标识和校验位!但是,接口提供方定的通信协议还是欠缺考虑...正常情况下,这个协议是没有问题的,但是在高并发的情况下,客户端方就需要点真功夫了. 分析 该通信协议中,没有使用事务号,也就是说,用同一条连接连续发送两次请求,你不知道返回的响应数据是哪个请求的.你可能会说,第一个响应是第一个请求的,第二个响应是第二个请求的!这是绝对的理想情况,服务器处理所有请求的耗时一样,网络没有抖动.如果耗时和网络抖动都无法确定的情况下,响应顺序与请求顺序就有

基于TCP连接的OV2640图像实时传输的STM32程序

不多说话 Show you the code. 其中TCP的封包使用了大神造的轮子,直接拖过来用. main.c /*********************************************************************** 文件名称:main.C 功 能: 编写时间: 注 意: ***********************************************************************/ #include "main.h&qu

python 批量执行脚本(服务端和客户端建立TCP连接)

有很多开源的批量部署的工具可以使用,比如puppet, ansible , saltstack , chef . 但这些工具都有自己的一套语法规则,你得按照他的语法来编写程序,然后批量执行. 那有没有方法可以直接写bash 或者Python脚本,然后批量执行呢? 方法当然是有的,需要自己写程序来传输脚本,拷贝文件,再复杂点,可以自定义脚本式同步还是异步执行,自定义要执行的主机组,等等,需要根据自己的业务需要来想. 这里只是抛砖引玉,我采用建立socket(TCP)连接来批量执行脚本. 服务端脚本

客户端无法tcp连接上本地虚拟机的问题(最后是linux防火墙问题)

刚装好裸的centos6.5,很多东西跟以前比都是没有的,所以做起来会遇到很多问题. 今天刚把svn 无法ci的问题解决了,起完服后,发现客户端连不上. 1)端口转发,查看了一下虚拟机的端口转发,发现无问题,windows下的防火墙也都关闭了. 2)在非本地服(145上) ping,和telnet 都说能连上,说明网络层没问题,但是貌似telnet没响应. 3)在本服上tcpdump 对外端口,尝试连接 或telnet的时候 发现很长一段时间内都连续收到了tcp的包,但是内容都是相同的, 是客户

redis java客户端Jedis 实现 连接池 + 简单的负载均衡

1.下载 redis_win_2.6.13.zip 安装包 下载地址:大家去百度吧 2.redis_win_2.6.13.zip 安装包解压缩后,进入redis-server.exe所在目录 在此目录中,新建一个配置文件:redis01.conf[此处文件名字,并不固定],文件内容如下: #是否以后台进程运行 daemonize yes   #指定后台进程的pid文件写入位置 pidfile /var/run/redis.pid   #监听端口,默认为6379 port 6379   #只接受以

10.TCP连接的建立与终止

1.建立连接协议 (1)请求端发送一个SYN段指明客户打算连接的服务器的端口,移机初始序号ISN.这个SYN段为报文段1. (2)服务器发回包含服务器的初始序号的SYN报文段作为应答.同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认.一个SYN将占用一个序号. (3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认. 这三个报文段完成连接的建立,这个过程也称为3次握手. 2.连接终止协议 终止一个连接需要进行4次握手,这是由TCP的半关闭造成的. 当

TCP连接之报文首部

在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目. TCP连接作为网络传输的一个环节,是不可或缺的一部分.例如,OSI七层模型的应用层HTTP就是基于TCP连接实现的. TCP连接的三次握手和四次挥手机制相信是每个后台开发人员耳熟能详的知识点,那么关于TCP的报文细节以及背后的原理是怎么样的呢?TCP是怎样借助报文来实现三次握手和四次挥手呢?笔者通过阅读书本和加上自己的理解.通过本文,来谈谈TCP报文首部以及报文首部背后的原理. 首先

Mysql线程池系列一:什么是线程池和连接池( thread_pool 和 connection_pool)

   thread_pool 和 connection_pool 当客户端请求的数据量比较大的时候,使用线程池可以节约大量的系统资源,使得更多的CPU时间和内存可以高效地利用起来.而数据库连接池的使用则将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量.使用情况等.本文我们主要就介绍一下线程池和数据库连接池的原理,接下来我们一起来了解一下这一部分内容. 首先介绍什么是mysql thread pool,干什么用的?使用线程池主要可以达到以下两个目的:1.在大并发的时

在Tomcat中配置连接池和数据源

1.DataSource接口介绍 (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制. 一个DataSource对象代表了一个真正的数据源.根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件.当一个DataSource对象注册到名字服务中(JNDI),应用程序就可以通过名字服务获得DataS