2012-04-24 70 views
4

目前,我有一个getter/setter方法插座模块如下在模块之间传递Socket.IO套接字的正确方法是什么?

var socket; 

module.exports.getSocket = getSocket; 
module.exports.setSocket = setSocket; 

function getSocket() { 
    return socket; 
} 
function setSocket(sock) { 
    if (undefined == socket) socket = sock; 
} 

在app.js我设置如下

var sio = require('./lib/socket'); 
var io = require('socket.io').listen(app); 
io.sockets.on('connection', function (socket) { 
    sio.setSocket(socket); 
}); 

在我的模块我用如下

sio = require('./lib/socket'); 
socket.getSocket().broadcast.emit(...); 

这似乎有点做作,有没有更好的方法来做到这一点?

编辑:我想要一个通用的解决方案来解决不是由客户端套接字启动的消息的问题。例如,假设我从外部来源检索股票价格,并希望在价格更新时触发事件。由于它不是客户端启动的,我怎样才能访问套接字?或者,也可以让我们说,我希望触发套接字消息来响应POST请求。我再一次不确定我将如何访问套接字。

+0

除非您只有一个用户使用该系统,否则您的代码无法工作。问题是,第一个连接的人将始终是由getSocket存储和返回的套接字。 – 2012-04-24 06:18:14

回答

4

有许多共享套接字的选项,但它有助于更​​多地了解您的模块将要执行的操作。不知道更多,我建议你通过你调用的函数将套接字传递给模块,而不是尝试使用某种共享状态。

如果您需要使用共享状态(您尝试将消息发送给由套接字消息以外的其他消息触发的特定用户),那么我会建议坚持使用已建立的会话框架并坚持套接字ID。你可以使用id来获得正确的套接字。

看到这个答案对于如何使用会话使用socket.io:socket.io and session?

添加一些更多的细节,我会修改我的答案。

UPDATE

如果你只是想给播报给大家谁是连接,你并不需要一个套接字句柄。从任何引用socket.io的模块中,您可以拨打io.sockets.emit('stuff')

+0

编辑了一些更详细的信息 – Hoa 2012-04-24 10:09:33

+0

已更新。您是否试图向特定用户或所有人发送消息? – 2012-04-24 17:53:46

相关问题