Socket.io向某些套接字发出消息(体系结构)

时间:2013-10-22 12:33:32

标签: javascript node.js socket.io

我有一个应用程序,其中用户具有带软木板的配置文件。

当用户在其他用户个人资料上写东西时,该个人资料页面上的每个人都应该收到发射。


在客户端,我连接到套接字服务器,如下所示:

window.onload = function() {
    var socket = io.connect("https://10.94.30.134:8080");
    // ...
};

请注意,client.js会加载并连接到我的profile.html的每次访问。我无法想象这是一个很好的方法。


在服务器端,我然后使用rooms来确定用户当前所在的个人资料页面。

sio.on("connection", function(socket){
    socket.join(socket.handshake.session.last_visited_profile);
    // ...
    socket.on("send-corkboard-message", function(data) { // ...
    socket.on("send-chat-message", function(data) { // ...  
});

目前的方法有效,但我认为还有很多需要改进的地方。我也遇到了使用我的移动设备测试此设置的问题。它们需要大约5-10秒才能连接到套接字服务器。 (这就是为什么我想在客户端全局存储套接字连接会更好。)如果是这样,我没有机会让套接字在连接时加入房间,我宁愿在我的路由或客户端中这样做喜欢订阅活动的一面?

将所有socket.io事件("send-corkboard-message", "send-chat-message"置于 connection事件中是一种好方法吗?

也许你可以帮助或链接我一些socket.io架构,这将改善我目前的情况。提前谢谢!

1 个答案:

答案 0 :(得分:0)

您无法在客户端存储套接字连接。服务器维护连接,并处理心跳和房间。至于你的第二个问题,不是 if 事件应该在connection处理程序中,而是你将它们放在那个处理程序。

例如,如果我们有一个处理程序:

io.sockets.on('connection', function(socket) {
  socket.emit('event', data);
});

socket对象在处理程序中在线定义。因此,您无法在其外部附加事件。

对于您的体系结构,您应该避免将数据发送到不需要数据的客户端。因此,如果您有完整或不需要某些数据的整个客户组,您可以创建房间,并让客户订阅连接上的某个房间:

io.sockets.on('connection', function(socket) {
  socket.on('subscribe', function(room) {
    socket.join(room);
  });
  socket.on('unsubscribe', function(room) {
    socket.leave(room);
  });
});

然后在客户端:

var socket = io.connect('/');
socket.emit('subscribe', 'room1');

另请注意,您无需等待DOM加载即可创建Socket.IO连接。因此,您不需要window.onload = function() {};,这可能会加快建立连接的速度。