Java HTTP/2 服务器套接字

Posted

技术标签:

【中文标题】Java HTTP/2 服务器套接字【英文标题】:Java HTTP/2 Server Socket 【发布时间】:2015-06-06 14:17:16 【问题描述】:

我想让服务器套接字在 Java 中为 HTTP/2 工作,最好是 TLS/https。

我的 TLS 服务器套接字工作正常,但浏览器只会与它通信 HTTP/1.1。如果我理解正确,您需要 ALPN 来获取 HTTP/2 浏览器以连接到您的 TLS 套接字并开始在其上运行 HTTP/2;浏览器不会要求在 https 上升级到 HTTP/2。到目前为止,Java8 似乎还没有做 ALPN。也许还有其他方法可以强制浏览器执行 HTTP/2,至​​少是非 TLS。

那么,有人知道如何为 HTTP/2 制作 Java 服务器套接字吗?

【问题讨论】:

您为什么不检查一下现有的实现,例如 Jetty、Netty 和 Undertow?见http2 implementations @DonghwanKim 是的,我看过其中两个。 ISTR,其中一个通过一些“SSLExtension”IIRC 将 ALPN 添加到 Java SSL 套接字。这可能是为 Java 获取 ALPN 的一种方式,因此能够让浏览器与“h2”HTTP/2 连接。可能工作量太大,我不知道。我可能只是等待并希望 Java 最终在某些更新中获得 ALPN。 Java 至少要到 JDK 9 才能获得 ALPN,预计在 2016 年末或 2017 年推出。同时,您可以使用 Jetty 的 ALPN implementation,或者更好的是,使用 Jetty (或建议的其他服务器)直接而不是使用 ServerSocket 进行自己的 HTTP/2 实现。 @sbordet 太好了!可以简单地告诉 JVM 在 VM 启动时使用“path_to_alpn_boot_jar”。这实际上是一个很好的答案——提示,提示。另外,感谢 Java 的 APLN 时间表。 【参考方案1】:

Java 至少要到 JDK 9 才能获得 ALPN,JDK 9 预计在 2016 年末或 2017 年推出。

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

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

【讨论】:

一定要用容器(我现在用的是Undertow,不过Jetty也是实心的)。没有理由重新发明整个堆栈,特别是因为 Spring MVC 或 Jersey 将为您处理所有管道。 @chrylis 我可以很好地理解 Jonas N,我还发现这个页面正在寻找一种让我的网络服务器支持 HTTP/2 的方法,因为它很有趣,你也可以从中学到很多东西关于 HTTP 的工作原理等。但无论如何感谢有关 Jetty 的 ALPN 实施的信息!【参考方案2】:

仅供参考,Java 开发团队正在为 Java 9 准备 ALPN。 希望你能看到这个问题,https://bugs.openjdk.java.net/browse/JDK-8062848,

ALPN 支持可能会向后移植到 JDK 8,因此需要实现 它没有引入任何新的 Java SE API。这可能需要 在 com.oracle.ssl.net 包中或通过 System 创建一些东西 属性。

【讨论】:

在 JDK

以上是关于Java HTTP/2 服务器套接字的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 python 套接字升级到 http2

使用 Chrome 或 Safari 强制 HTTP/2

java的套接字Socket问题

Java - 异步套接字通道无法连接到远程异步服务器套接字通道

如何将java套接字连接到远程服务器套接字

在java中停止阻塞套接字