Jetty
TCP + UDP 并存:
var server = new Server();
var tcpConn = new ServerConnector(server, scf, new ALPNServerConnectionFactory("h2"), new HTTP2ServerConnectionFactory(hc));
server.addConnector(tcpConn);
var h3 = new QuicheServerConnector(server, scf, h3config, http3);
server.addConnector(h3); // 若想跟 tcpConn 用同一端口,必须监听 onOpen 回调,且晚于 tcpConn 添加。
tcpConn.addEventListener(new NetworkConnector.Listener() {
@Override public void onOpen(NetworkConnector nc) { h3.setPort(nc.getLocalPort()); }
});
server.start();
ServerConnector 入参 acceptors, selectors 默认值为内部决定数值的 -1,为了避免创建太多处理连接,故写死到1。
HTTP/3 必须依赖库:
implementation(platform("org.eclipse.jetty:jetty-bom:12.1.9")) // 未包含 org.eclipse.jetty.ee11 等库。
implementation("org.eclipse.jetty.http3:jetty-http3-server")
implementation("org.eclipse.jetty.quic:jetty-quic-quiche-server")
implementation("org.eclipse.jetty.quic:jetty-quic-quiche-jna") // 不加则报 no quiche binding implementation found
implementation("org.slf4j:slf4j-simple:2.0.17") // 支持指定日志级别 -Dorg.slf4j.simpleLogger.defaultLogLevel=debug
注意 - Windows 上 PemExporter 报 Unable to set Posix file permissions!暂只能跑在 Linux 上。
最小响应/避免卡住超时:
var sessionListener = new Session.Server.Listener() {
@Override public Stream.Server.Listener onRequest(Session.Server ss, HeadersFrame hf) {
return new Stream.Server.Listener() {
@Override public void onRequest(Stream.Server ss, HeadersFrame hf) {
var resp = new MetaData.Response(HttpStatus.NO_CONTENT_204, null, HttpVersion.HTTP_3, HttpFields.EMPTY);
ss.respond(new HeadersFrame(resp, true), Promise.Invocable.noop());
}
};
}
};