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

时间:2016-07-29 15:40:35

标签: javascript node.js express websocket http2

我在Node.js中使用socket.io,node-http2和express编写了一个Web Socket服务器。服务器按预期工作,除了根据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?

2 个答案:

答案 0 :(得分:2)

正如评论中所讨论的,Chrome最近已停止允许针对HTTP / 2进行较旧的NPN协商,而是坚持使用较新的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。另一种方法是通过网络服务器路由您的NodeJs调用,这更容易升级OpenSSL(例如Nginx或Apache)以支持ALPN上的HTTP / 2。

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

答案 1 :(得分:0)

有点晚了,但是使用Express4和Spdynpm)效果很好。

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')();
...

客户端截图: enter image description here