获取socket.io,express和node-http2通过HTTP / 2进行通信

我使用socket.io,node-http2编写了一个Web Socket服务器,并在Node.js中表示。 除了根据Chrome的DevTools socket.io的协商请求通过HTTP / 1.1(如下所示)之外,服务器按预期工作。 如果请求是使用HTTP / 2发送的,则“协议”列应显示h2

这只在Chrome中发生,其他浏览器使用正确的协议。

服务器代码(缩写):

 var PORT = 8667, config = require('./config'), socketioServer = require('socket.io'), app = express(), https = require('http2'), cors = require('cors'); app.use(cors(function(req, callback){ var corsOptions = { origin: false }; if (/^https:\/\/mlpvc-rr\.lc/.test(req.header('Origin'))) corsOptions.origin = true; callback(null, corsOptions); })); app.get('/', function (req, res) { res.sendStatus(403); }); var server = https.createServer({ cert: fs.readFileSync(config.SSL_CERT), key: fs.readFileSync(config.SSL_KEY), }, app); server.listen(PORT); var io = socketioServer.listen(server); // ... 

浏览器连接代码:

 var conn = io('https://ws.'+location.hostname+':8667/', { reconnectionDelay: 5000 }); conn.on('connect', function(){ console.log('[WS] Connected'); }); conn.on('disconnect',function(){ console.log('[WS] Disconnected'); }); 

testssl.sh的输出:

我需要更改什么来使socket.io请求通过HTTP / 2?

正如评论中所讨论的那样,Chrome最近停止了允许旧的NPN协商HTTP / 2,而坚持使用更新的ALPN协议。 有关详情,请参阅此文章: https : //ma.ttias.be/day-google-chrome-disables-http2-nearly-everyone-may-31st-2016/

所以你基本上需要Node.js来支持ALPN,它看起来只是在v5中添加的: https : //github.com/nodejs/node/pull/2564 。 另一种方法是通过一个更容易升级OpenSSL(例如Nginx或Apache)的networking服务器路由你的NodeJs呼叫,以支持通过ALPN的HTTP / 2。

您确认这是使用testssl.sh程序,确认没有ALPN支持和Firefox使用HTTP / 2的事实问题。