Java HTTP/2 服务器套接字

8
我希望能够使用Java实现TLS/https的HTTP/2服务器套接字。我已经成功地创建了一个TLS服务器套接字,但浏览器只会将其升级为HTTP/1.1。如果我理解正确,您需要使用ALPN才能让HTTP/2浏览器连接到您的TLS套接字并在其中运行HTTP/2;浏览器不会要求升级到HTTPS上的HTTP/2。目前似乎Java8不支持ALPN。也许还有其他方法来强制浏览器使用HTTP/2,至少非TLS的情况下是可行的。那么,有没有人知道如何为HTTP/2创建Java服务器套接字?

3
你为什么不去查看现有的实现,比如Jetty、Netty和Undertow呢?请参考http2实现 - Donghwan Kim
@DonghwanKim 是的,我看过其中两个。如果我没记错的话,其中一个通过某种“SSLExtension”向Java SSL套接字添加了ALPN。这可能是获得Java ALPN并因此能够使浏览器连接到'h2' HTTP/2的一种方法。这可能需要太多工作,我不确定。我可能会等待并希望Java最终在某个更新中获得ALPN。 - Jonas N
1
Java至少要等到JDK 9,也就是2016年底或2017年才能获得ALPN。与此同时,您可以使用JettyALPN实现,或者更好的是,直接使用Jetty(或其他建议的服务器),而不是使用ServerSocket进行自己的HTTP/2实现。 - sbordet
@sbordet 太好了!我们可以在 VM 启动时直接告诉 JVM 使用 'path_to_alpn_boot_jar'。这实际上是一个很好的答案——暗示,暗示。另外,感谢提供 Java 的 APLN 时间表。 - Jonas N
2个回答

12

Java在至少JDK9之前不会获得ALPN支持,该版本计划于2016年末或2017年发布。

同时,您可以使用JettyALPN实现,或者更好的是,直接使用Jetty(或其他建议的服务器),而不是使用ServerSocket编写自己的HTTP/2实现。

[免责声明,我是Jetty的提交者] Jetty 9.3对HTTP/2提供了很好的支持,包括HTTP/2 Push


一定要使用容器(我现在使用Undertow,但Jetty也很可靠)。没有理由重新发明整个堆栈,特别是因为Spring MVC或Jersey将为您处理所有的管道工作。 - chrylis -cautiouslyoptimistic-
3
@chrylis,我很理解Jonas N所说的,我也是在寻找使我的Web服务器支持HTTP/2的方法时发现了这个页面,因为这样做既有趣又可以学到很多关于HTTP工作原理的知识。无论如何,感谢您提供Jetty的ALPN实现信息! - Ercksen

1
FYI,Java Dev团队正在为Java 9准备ALPN。 希望您能看到这个问题,https://bugs.openjdk.java.net/browse/JDK-8062848
引用: ALPN支持可能会被回溯到JDK 8,因此需要实现一个不引入任何新的Java SE API的实现。这可能需要通过com.oracle.ssl.net包或System Properties创建一些东西。

Jetty ALPN的使用和JDK < 9对HTTP/2的支持是否需要使用SSL和https连接?我看到的所有示例都使用https,但想知道是否也可以在普通http上完成? - GameSalutes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接