3

我的服务器上运行了两个 Express.js 应用程序。

一个普通的应用程序称为“main-app”,另一个使用 Socket.IO 的应用程序称为“socket-app”。

我在“mydomain.com”和“socket-app”在“socket.mydomain.com”的子域上运行“main-app”

我通过 Express 的内置 vhost 中间件将请求路由到套接字应用程序。

-- 在 main-app.js 里面 --

var express = require('express');
var app = module.exports = express.createServer();
app.use(express.vhost('socket.mydomain', require('./socket-app/app.js')));

app.listen(8080, function(){
  console.log("Express server listening on port %d in %s mode");
});

这工作正常,我可以看到我的套接字应用程序在 socket.mydomain 的端口 8080 上运行

但是,通过这里讨论的通过 vhost 运行 Socket.IO 应用程序时,websockets 超时并且没有接收到“升级”事件似乎存在问题

所以我的问题是如何将这个“升级”事件从我的主应用程序传输到我的套接字应用程序,以便所有连接的套接字都能听到有人连接和断开连接?

我尝试从“主应用程序”中发出“升级”事件,但它似乎没有工作。

app.on('upgrade', function(req, socket) {
    socket.emit('upgrade', app);    
});

我在这里想念什么?

4

1 回答 1

6

解决方案是在您的根应用程序中创建一个 Socket.IO 实例,该实例可由您的子域应用程序全局访问,然后在其自己的 Socket.IO 命名空间中运行每个应用程序以保持其自主权。

我刚刚构建了一个简单的示例,它运行聊天应用程序的三个实例,它们都共享同一个 Socket.IO 实例,该实例在根应用程序中声明。

如果您克隆项目并按照说明设置本地子域,您可以看到聊天应用程序的每个实例独立于其他实例运行。

明天早上我会尝试写一篇博客文章,详细说明它是如何工作的。

更新

这是一篇关于如何跨多个域共享 Socket.IO 实例的文章。

于 2012-06-15T01:41:10.730 回答