Javascript 获取socket.io、express&;node-http2通过HTTP/2进行通信

Javascript 获取socket.io、express&;node-http2通过HTTP/2进行通信,javascript,node.js,express,websocket,http2,Javascript,Node.js,Express,Websocket,Http2,我在node.js中使用Socket.io、node-http2和express编写了一个Web套接字服务器。除了根据Chrome的DevTools socket.io的协商请求通过HTTP/1.1(如下所示)之外,服务器可以按预期工作。如果使用HTTP/2发送请求,“协议”列应显示h2 这只发生在Chrome浏览器中,其他浏览器使用正确的协议 服务器代码(缩写): 浏览器连接代码: var conn = io('https://ws.'+location.hostname+':8667/',

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

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

服务器代码(缩写):

浏览器连接代码:

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');
});
产出:


要使socket.io请求通过HTTP/2,我需要做哪些更改?

如评论中所述,Chrome最近停止了对HTTP/2的旧NPN协商,并坚持使用新的ALPN协议。有关更多信息,请参阅本文:

因此,您基本上需要Node.js来支持ALPN,它看起来只是在v5中添加的:。另一种方法是通过Web服务器路由您的NodeJs调用,该服务器更容易升级OpenSSL(例如Nginx或Apache),以支持ALPN上的HTTP/2


您通过使用确认不支持ALPN的程序以及Firefox使用HTTP/2的事实确认了这一点。

有点晚了,但是使用Express4和()工作得很好

bin/www:

var app = require('../app');
var debug = require('debug')('gg:server');
var spdy = require('spdy');
var fs = require('fs');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
var options = {
    key: fs.readFileSync(__dirname + '/server.key'),
    cert: fs.readFileSync(__dirname + '/server.crt')
}
var server = spdy.createServer(options, app);
var io = app.io
io.attach(server);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
...
app.js:

...
var app = express();
var io = app.io = require('socket.io')();
...
客户端屏幕截图:

你好。你能给我一个完整的例子吗?我很想仔细看看。乍一看,这似乎与WebSocket有关(socket.io使用哪个,HTTP/2不支持哪个),但您显示的请求似乎是普通的Ajax…@dsign服务器是开源的,您使用哪个SSL库(openssl?),哪个版本,它支持ALPN@BazzaDP我也不知道,我只是默认使用
npm安装的任何东西。
config.*
变量只是指向特定SSL密钥/crt文件的字符串。是的,需要改用testssl.sh。在其他浏览器(如Opera?)中,它是否也可以与h2一起使用?另外,您是否有任何防病毒软件拦截您的流量,这些软件通常会将您降级为http/1.1My服务器正在Node.js版本4.4.7上运行,该版本(根据)默认附带OpenSSL 1.0.2,但如果我错了,请纠正我。在我看来,ALPN仅适用于Node 5:。看起来好像有话要把它向后移植到v4,但还没有完成:谢谢你提供的信息,我会一直等到v6点击LTS。
...
var app = express();
var io = app.io = require('socket.io')();
...