http2-qing

A library for http2 protocol based on netty

License

License

GroupId

GroupId

com.github.snchengqi
ArtifactId

ArtifactId

http2-qing
Last Version

Last Version

1.0.1
Release Date

Release Date

Type

Type

pom
Description

Description

http2-qing
A library for http2 protocol based on netty
Project URL

Project URL

https://github.com/snchengqi/http2-qing
Source Code Management

Source Code Management

https://github.com/snchengqi/http2-qing

Download http2-qing

Filename Size
http2-qing-1.0.1.pom 4 KB
Browse

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.snchengqi/http2-qing/ -->
<dependency>
    <groupId>com.github.snchengqi</groupId>
    <artifactId>http2-qing</artifactId>
    <version>1.0.1</version>
    <type>pom</type>
</dependency>
// https://jarcasting.com/artifacts/com.github.snchengqi/http2-qing/
implementation 'com.github.snchengqi:http2-qing:1.0.1'
// https://jarcasting.com/artifacts/com.github.snchengqi/http2-qing/
implementation ("com.github.snchengqi:http2-qing:1.0.1")
'com.github.snchengqi:http2-qing:pom:1.0.1'
<dependency org="com.github.snchengqi" name="http2-qing" rev="1.0.1">
  <artifact name="http2-qing" type="pom" />
</dependency>
@Grapes(
@Grab(group='com.github.snchengqi', module='http2-qing', version='1.0.1')
)
libraryDependencies += "com.github.snchengqi" % "http2-qing" % "1.0.1"
[com.github.snchengqi/http2-qing "1.0.1"]

Dependencies

compile (1)

Group / Artifact Type Version
org.apache.maven.plugins : maven-gpg-plugin jar 1.6

test (1)

Group / Artifact Type Version
junit : junit jar 4.11

Project Modules

  • http2-qing-core
  • http2-qing-client
  • http2-qing-server
  • http2-qing-example

http2-qing

http2-qing is a library for http2 protocol based on netty

中文文档

GitHub release (latest by date)

Features

  • Develop based on netty,with good performance
  • Encapsulate the http2 protocol and provide simple and easy-to-use APIs
  • Basically all asynchronous methods
  • Support manage connections of server and server-push
  • Provides client disconnection and reconnection and support customized reconnect policy

How to use

program codes for server

Firstly, import maven dependency about http2-server to your project

<dependency>
  <groupId>com.github.snchengqi</groupId>
  <artifactId>http2-qing-server</artifactId>
  <version>1.0.1</version>
</dependency>

Construct the environment of server, and config necessary options. Firstly, you need to new a Environment4Server object, and then set propeties such as port,ConnectionManager,RequestHandler, as follows excample

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();
});

Using Http2ServerFactoryBuilder to build the object which is a factory method object of Http2Server, so you can create a Http2Server Object, then start the server

Http2ServerFactory factory = new Http2ServerFactoryBuilder(env).build();
Http2Server server = factory.createServer();
CompletableFuture<Void> bindFuture = server.start();
bindFuture.get();

And then, could get the connection by connectionManager which you defined, and send server-push to remote endpoint, for example, like this

connectionManager.forEach(connection -> {
    CompletableFuture<HttpPushAck> 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();
    });
};

Finally, don`t forget close the Http2Server to release resources

server.close();

program code for client

Firstly, import maven dependency about http2-client to your project

<dependency>
  <groupId>com.github.snchengqi</groupId>
  <artifactId>http2-qing-client</artifactId>
  <version>1.0.1</version>
</dependency>

Construct the environment of client, and config necessary options. Firstly, you need to new a Environment4Client object, and then set propeties such as remote ip and port,ServerPushHandler, as follows excample

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();
});

Using Http2ClientFactoryBuilder to build the object which is a factory method object of Http2Client, so you can create a Http2Client Object, then start it to connect to remote server

Http2ClientFactory factory = new Http2ClientFactoryBuilder(env).build();
Http2Client client = factory.createClient();
CompletableFuture<Void> connectFuture = client.connect();
connectFuture.get();

After connected to server, you can user the client to send a request and receive response asynchronously

String requestContent = "request message of client";
HttpRequest request = new HttpRequest(EmptyHttp2Headers.INSTANCE, requestContent.getBytes());
CompletableFuture<HttpResponse> 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();
});

Finally,remember to close the client

client.close();

Versions

Version
1.0.1