Javascript 在Socket.IO和WS之间共享WebSocket连接

Javascript 在Socket.IO和WS之间共享WebSocket连接,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,为了能够在利用Socket.IO的RPC功能的同时发送二进制数据,我认为可以在同一台服务器上同时使用Socket.IO和模块。我不想打开完全独立的服务器来建立两个连接,而是想知道是否可以使用相同的HTTP服务器 是否可以同时对Socket.IO和WS使用一个使用http.createServer()创建的服务器?明确地说,我希望从客户端创建Socket.IO连接和常规WebSocket连接。下面的代码在客户端创建协议错误,可能是因为Socket.IO和WS都试图处理连接 var http = r

为了能够在利用Socket.IO的RPC功能的同时发送二进制数据,我认为可以在同一台服务器上同时使用Socket.IO和模块。我不想打开完全独立的服务器来建立两个连接,而是想知道是否可以使用相同的HTTP服务器

是否可以同时对Socket.IO和WS使用一个使用http.createServer()创建的服务器?明确地说,我希望从客户端创建Socket.IO连接和常规WebSocket连接。下面的代码在客户端创建协议错误,可能是因为Socket.IO和WS都试图处理连接

var http = require('http');
var server = http.createServer(app);
server.listen(3000);

// Socket.IO
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
    // ...
}

// ws
var WebSocketServer = require('ws').Server
var wss = new WebSocketServer({server: server});
wss.on('connection', function (ws) {
    // ...
}
var server = http.createServer(app);
server.listen(3000);

var WebSocketServer = require('ws').Server
var io = require('socket.io').listen(server);

io.set('destroy upgrade', false);
io.set('transports', ['websocket']);

io.sockets.on('connection', function (socket) {
    var wss = new WebSocketServer({
        server: server,
        path: '/anythingYouWant/' + socket.id
    });
    wss.on('connection', function(ws) {
        ws.on('message', function(message) {
            console.log(message);
        });
    });
});

事实证明,通过某些配置,这是可能的。诀窍是告诉Socket.IO不要破坏非Socket.IO WebSocket连接请求,然后将Socket.IO和WS放在不同的路径上。下面是一些凌乱的示例代码,但它在为辅助连接重用Socket.IO会话ID时起作用

var http = require('http');
var server = http.createServer(app);
server.listen(3000);

// Socket.IO
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
    // ...
}

// ws
var WebSocketServer = require('ws').Server
var wss = new WebSocketServer({server: server});
wss.on('connection', function (ws) {
    // ...
}
var server = http.createServer(app);
server.listen(3000);

var WebSocketServer = require('ws').Server
var io = require('socket.io').listen(server);

io.set('destroy upgrade', false);
io.set('transports', ['websocket']);

io.sockets.on('connection', function (socket) {
    var wss = new WebSocketServer({
        server: server,
        path: '/anythingYouWant/' + socket.id
    });
    wss.on('connection', function(ws) {
        ws.on('message', function(message) {
            console.log(message);
        });
    });
});

截至2016年,我可以简单地为websocket模块ws分配一个路径

var wss = new WebSocketServer({ server: server, path: '/ws' }); //do not interfere with socket.io
根本不需要更改socket.io端