【发布时间】:2016-12-04 09:34:21
【问题描述】:
我使用 socket.io、node-http2 和 node.js 中的 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,我需要进行哪些更改?
【问题讨论】:
-
嗨。你能给我一个完整的例子吗?我很想仔细看看它。乍一看,它似乎与 websockets (socket.io 使用,并且不受 HTTP/2 支持)有关,但是您显示的请求 似乎 是普通的 Ajax...
-
@dsign 服务器在github.com/ponydevs/MLPVC-WS开源
-
您使用的是哪个 SSL 库(openssl?),哪个版本支持 ALPN? ma.ttias.be/…
-
@BazzaDP 我也不知道,我只使用默认安装的
npm install。config.*变量只是指向特定 SSL 密钥/crt 文件的字符串。 -
是的,需要使用 testssl.sh 来代替。它是否也适用于其他浏览器(例如 Opera?)中的 h2?另外,您是否有任何防病毒软件拦截您的流量,通常会将您降级为 http/1.1
标签: javascript node.js express websocket http2