Java 如何为活动性ping http2服务器端口(grpc服务器)?

Java 如何为活动性ping http2服务器端口(grpc服务器)?,java,grpc,http2,Java,Grpc,Http2,我正在尝试ping一个grpc-http2服务器端口以获得活跃性。在Http1.1中,我们将使用url.openConnection并检查响应状态代码 http2中的等效物是什么 下面的代码似乎没有错误,但我不知道如何使用它来检查请求是否成功 import org.apache.commons.io.IOUtils; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpURI; import or

我正在尝试ping一个grpc-http2服务器端口以获得活跃性。在Http1.1中,我们将使用
url.openConnection
并检查响应状态代码

http2中的等效物是什么

下面的代码似乎没有错误,但我不知道如何使用它来检查请求是否成功

import org.apache.commons.io.IOUtils;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.api.Session;
import org.eclipse.jetty.http2.api.Stream;
import org.eclipse.jetty.http2.api.server.ServerSessionListener;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.frames.HeadersFrame;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.FuturePromise;
import org.eclipse.jetty.util.Jetty;
import org.eclipse.jetty.util.ssl.SslContextFactory;

import javax.net.ssl.HttpsURLConnection;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.util.concurrent.TimeUnit;

public class HeartbeatCheckHttp2 {
    public static void main(String [] args) throws Exception {
        for (int i=0; i<50000; ++i) {
            Thread.sleep(400L);

            HTTP2Client client = new HTTP2Client();
            client.start();

            // Connect to host.
            String host = "localhost";
            int port = 50000;

            FuturePromise<Session> sessionPromise = new FuturePromise<>();
            client.connect(new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);


            // Obtain the client Session object.
            Session session = sessionPromise.get(5, TimeUnit.SECONDS);

            // Prepare the HTTP request headers.
            HttpFields requestFields = new HttpFields();
            requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
            requestFields.put("Content-Type", "application/grpc");
            // Prepare the HTTP request object.
            MetaData.Request request = new MetaData.Request("POST", new HttpURI("http://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
            // Create the HTTP/2 HEADERS frame representing the HTTP request.
            HeadersFrame headersFrame = new HeadersFrame(request, null, true);

            // Prepare the listener to receive the HTTP response frames.
            Stream.Listener responseListener = new Stream.Listener.Adapter()
            {
                @Override
                public void onData(Stream stream, DataFrame frame, Callback callback)
                {
                    byte[] bytes = new byte[frame.getData().remaining()];
                    frame.getData().get(bytes);
                    callback.succeeded();
                }
            };

            session.newStream(headersFrame, new FuturePromise<>(), responseListener);
            session.newStream(headersFrame, new FuturePromise<>(), responseListener);
            session.newStream(headersFrame, new FuturePromise<>(), responseListener);

            Thread.sleep(TimeUnit.SECONDS.toMillis(20));


            client.stop();
        }
    }
}
import org.apache.commons.io.IOUtils;
导入org.eclipse.jetty.http.HttpFields;
导入org.eclipse.jetty.http.HttpURI;
导入org.eclipse.jetty.http.HttpVersion;
导入org.eclipse.jetty.http.MetaData;
导入org.eclipse.jetty.http2.api.Session;
导入org.eclipse.jetty.http2.api.Stream;
导入org.eclipse.jetty.http2.api.server.ServerSessionListener;
导入org.eclipse.jetty.http2.client.HTTP2Client;
导入org.eclipse.jetty.http2.frames.DataFrame;
导入org.eclipse.jetty.http2.frames.HeadersFrame;
导入org.eclipse.jetty.util.Callback;
导入org.eclipse.jetty.util.FuturePromise;
导入org.eclipse.jetty.util.jetty;
导入org.eclipse.jetty.util.ssl.SslContextFactory;
导入javax.net.ssl.HttpsURLConnection;
导入java.io.IOException;
导入java.net.HttpURLConnection;
导入java.net.InetSocketAddress;
导入java.net.Socket;
导入java.net.URL;
导入java.util.concurrent.TimeUnit;
公共类HeartbeatCheckHttp2{
公共静态void main(字符串[]args)引发异常{

对于(inti=0;i,HTTP/2协议具有内置的心跳帧,可用于仅“ping”另一个对等方以获得活跃度

HTTP2Client client=newhttp2client();
client.start();
未来承诺会话承诺=新的未来承诺();
connect(新的InetSocketAddress(主机、端口),新的ServerSessionListener.Adapter(){
@凌驾
公共void onPing(会话,PingFrame){
//另一个同伴回复我们的ping。
}
},会期承诺);
Session Session=sessionPromise.get(5,时间单位为秒);
ping(新的PingFrame(System.nanoTime(),false),Callback.NOOP);
说到内置的ping功能,如果要检查HTTP请求的响应状态,应该实现
onHeaders()

Stream.Listener responseListener=new Stream.Listener.Adapter(){
@凌驾
页眉上的公共空白(流、页眉框架){
元数据=frame.getMetaData();
if(metaData.isResponse()){
MetaData.Response-Response=(MetaData.Response)元数据;
int status=response.getStatus();
...
}
}
@凌驾
公共void onData(流、数据帧、回调){
...
}
};
对于通过HTTP/2框架讲HTTP的服务器,您可以这样做

对于gRPC,情况可能会有所不同,因为它是通过HTTP/2帧传输的,但它不是HTTP