【问题标题】:Socket.io emit message to certain sockets (architecture)Socket.io 向某些套接字发出消息(架构)
【发布时间】:2013-10-22 12:33:32
【问题描述】:

我有一个应用程序,其中用户的个人资料带有软木板。

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


在客户端,我像这样连接到套接字服务器:

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 架构。提前致谢!

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    您不能在客户端存储套接字连接。服务器负责维护连接,还处理心跳和房间。至于您的第二个问题,这不是 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() {};,这可能会加快连接的建立。

    【讨论】:

    • 谢谢!当我最终在每个站点请求的连接处理程序中结束时,我也可以在服务器上的连接处理程序中“订阅”,就像我在上面的帖子中描述的那样?
    • 这是问题还是陈述?
    • 我想听听你的意见,是的。
    • 我真的不知道您的应用程序的结构,但是,请避免将数据发送给不需要它们的客户端。
    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多