我正在将一个预先存在的项目从 Socket.io (socket-io / socketio) 转换为普通的 Websockets,我希望在转换过程中同时运行这两个项目。
我期望做什么
'use strict';
var app = require('express')();
var server = require('http').createServer(app);
var ws = require('ws');
var wss = new ws.Server({ noServer: true })
var io = require('socket.io')({ path: '/api/socket.io' });
server.on('upgrade', function upgrade(req, socket, head) {
if ('/api/ws' === req.url) {
wss.handleUpgrade(req, socket, head, function (ws) {
wss.emit('connection', ws, req);
});
} else if ('/api/socket.io' === req.url) {
io.XXXXX() // ??? <=== MISSING DOCUMENTATION FOR THIS
} else {
socket.destroy();
}
});
// ... handle connections, listen on port 3000, etc
以前的解决方案
ws
具有出色的文档,准确地显示了如何使用upgrade
标头以基于标准的方式执行此操作:
我还发现了一篇关于如何以 Socket.io 专有的方式进行操作的帖子:
我什至找到了一个关于如何将两者与一个非常非常旧的 Socket.io 版本混合在一起的旧参考:
但我不清楚如何将 Socket.io v2s 专有/私有内部实现方式与ws
标准头升级技术混合使用。
是否可以只使用老式upgrade
事件?如果没有,应对两者竞争的新策略是什么?
看来我能够弄清楚如何处理对每个成功的请求,但最令人费解的部分是如何拒绝两者都不处理的请求。