# http2-qing
**Repository Path**: snchengqi/http2-qing
## Basic Information
- **Project Name**: http2-qing
- **Description**: 一个基于netty的HTTP2.0协议库
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: 1.0.0
- **Homepage**: https://github.com/snchengqi/http2-qing
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2020-08-14
- **Last Updated**: 2025-02-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# http2-qing
http2-qing是一个底层使用Netty封装的HTTP2.0协议库


## 特性
- 基于Netty开发,拥有很好的性能
- 对HTTP2协议的封装,提供了简单易用的API
- 基本上所有的方法都是异步的
- 支持连接全生命周期的管理和服务器推送(server-push)
- 提供了客户端断连重连机制,并且支持自定义重连策略
## 如何使用
### 服务端编码
首先,通过Maven构建工具将http2-qing-server模块的依赖引入到项目中。
```xml
com.github.snchengqi
http2-qing-server
1.0.1
```
构造服务器环境,配置必须的启动参数。首先,需要创建一个Environment4Server 对象,创建好对象之后,设置比如端口,ConnectionManager,RequestHandler的属性,如下示例:
```java
SimpleConnectionManager connectionManager = new SimpleConnectionManager();
Environment4Server env = new Environment4Server();
env.setPort(8080).setConnectionManager(connectionManager).setRequestHandler(context -> {
if (context.isSuccess()) {
ConnectionFacade connection = context.connection();
Http2Stream stream = context.stream();
HttpRequest request = context.request();
String responseMessage = "server response for client request";
System.out.println("=============================");
System.out.println("time:" + new Date());
System.out.println("server receive client request message:" + new String(request.getBody()));
System.out.println("stream id:" + stream.id());
System.out.println("server send response message:" + responseMessage);
System.out.println("=============================");
HttpResponse response = new HttpResponse(EmptyHttp2Headers.INSTANCE, responseMessage.getBytes());
connection.sendResponse(response, stream.id());
return;
}
context.cause().printStackTrace();
});
```
利用Http2ServerFactoryBuilder 对象去构建一个Http2Server的工厂对象Http2ServerFactory,之后你就可以创建Http2Server 对象了,对象创建完成之后启动Http2Server。
```java
Http2ServerFactory factory = new Http2ServerFactoryBuilder(env).build();
Http2Server server = factory.createServer();
CompletableFuture bindFuture = server.start();
bindFuture.get();
```
之后你可以通过你先前定义好的connectionManager获取连接,并且可以通过server-push机制将消息推送到对端,示例如下:
```java
connectionManager.forEach(connection -> {
CompletableFuture future = connection.sendPushMessage(new HttpPushEntity(EmptyHttp2Headers.INSTANCE,pushMessage.getBytes()));
future.whenComplete((r, cause) -> {
if (cause == null) {
System.out.println("=============================");
System.out.println("time:" + new Date());
System.out.println("server send push message:" + pushMessage);
System.out.println("receive client ack:" + new String(r.getBody()));
System.out.println("=============================");
return;
}
cause.printStackTrace();
});
};
```
最后,当关闭程序时,不要忘记调用Http2Server的close方法来释放资源。
```java
server.close();
```
### 客户端编码
首先,通过Maven构建工具将http2-qing-client模块的依赖引入到项目中。
```xml
com.github.snchengqi
http2-qing-client
1.0.1
```
构造客户端环境对象,并且配置必须的启动参数。首先,你需要创建一个Environment4Client对象,之后设置像服务器ip,端口和ServerPushHandler等属性,示例如下:
```java
Environment4Client env = new Environment4Client();
env.setIp("127.0.0.1").setPort(8080).setServerPushHandler(context -> {
if (context.isSuccess()) {
Http2Client client = context.client();
HttpPushEntity pushEntity = context.pushEntity();
Http2Stream stream = context.stream();
String ackMessage = "client ack for server push";
System.out.println("=============================");
System.out.println("time:" + new Date());
System.out.println("client receive server push:" + (pushEntity.getBody() == null? "null": new String(pushEntity.getBody())));
System.out.println("stream id:" + stream.id());
System.out.println("client ack message:" + ackMessage);
System.out.println("=============================");
HttpPushAck ack = new HttpPushAck(EmptyHttp2Headers.INSTANCE, ackMessage.getBytes());
client.sendPushAck(ack, stream.id());
return;
}
context.cause().printStackTrace();
});
```
利用Http2ClientFactoryBuilder对象来构建创建Http2Client的工厂方法对象Http2ClientFactory,之后你就可以创建Http2Client了,并且可以启动客户端连接到服务器。
```java
Http2ClientFactory factory = new Http2ClientFactoryBuilder(env).build();
Http2Client client = factory.createClient();
CompletableFuture connectFuture = client.connect();
connectFuture.get();
```
连接到服务器之后,你可以利用客户端异步地发送http2请求和接收服务器的响应消息。
```java
String requestContent = "request message of client";
HttpRequest request = new HttpRequest(EmptyHttp2Headers.INSTANCE, requestContent.getBytes());
CompletableFuture requestFuture = client.sendRequest(request);
requestFuture.whenComplete((r, cause) -> {
if (cause == null) {
System.out.println("=============================");
System.out.println("time:" + new Date());
System.out.println("client send request message:" + requestContent);
System.out.println("receive server response:" + new String(r.getBody()));
System.out.println("=============================");
return;
}
cause.printStackTrace();
});
```
最后,记得关闭客户端以释放资源。
```java
client.close();
```