5

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

是否可以同时使用http.createServer()为 Socket.IO 和 WS 创建的一个服务器?需要明确的是,我预计从客户端创建一个 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) {
    // ...
}
4

2 回答 2

5

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

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);
        });
    });
});
于 2013-11-03T05:29:20.283 回答
3

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

var wss = new WebSocketServer({ server: server, path: '/ws' }); //do not interfere with socket.io

根本不需要改变 socket.io 端

于 2016-05-11T22:23:47.177 回答