【问题标题】:How to connect multiple socket.io clients to different URLs in Node.js?如何将多个 socket.io 客户端连接到 Node.js 中的不同 URL?
【发布时间】:2012-03-23 12:29:40
【问题描述】:

我正在尝试为 Node.js 中的不同 URL 连接许多 socket.io 客户端,如下所示:

app.get('/:id',function(req,res){
io.of('/'+id).on('connection',function(socket){
    socket.emit('hello');

})
});

这可行,但是有一个问题:

例如,当浏览器刷新页面 http://localhost:3000/xyz 时,事件 socket.emit 会被触发两次。

如果有人访问页面http://localhost:3000/xyz 10 次,则事件触发 10 次。

这不好,因为每次用户访问该页面时,套接字事件都会被触发 n+1 次。

应该怎么做,这样我就可以将套接字注册到不同的 URL,同时又不会出现这种异常。

另一件事:

如果我这样做:

var sock;

io.of('/'+xyz).on('connection',function(socket){
    sock=socket;

})


app.get('/:id',function(req,res){
    sock.emit('hello');

})

如果我使用上面的代码,那么套接字不会在 time 中成功保存到 sock 变量中。这意味着,我必须做一个大约 1000 的 setInterval .. 这样

sock=socket 

行被触发。

请帮帮我。

【问题讨论】:

    标签: url node.js socket.io


    【解决方案1】:

    因此,在对http://localhost:3000/id 的每个请求中,您都注册了一个新的处理程序,您应该这样做一次,而不是每次请求。

    app.get('/:id',function(req,res){
        io.of('/'+id).on('connection',function(socket){
            socket.emit('hello');
    
        })
    });
    

    【讨论】:

    • 是的,我知道 .. 但我的用例的解决方案是什么?
    • 你的方法是错误的,你必须存储 id-socket 关系,并通过使用请求的 id 找到它来向受尊重的套接字发出一个事件。
    【解决方案2】:

    我使用以下方法来实现这个目标:

    客户端:

    var socket = io.connect('http://localhost:8183/?clientId='+clientId,{"force new connection":true});
    

    服务器端:

    var io = require('socket.io').listen(server);
    io.sockets.on('connection', function(socket) {
        console.log("url"+socket.handshake.url);
        clientId=socket.handshake.query.clientId;
        console.log("connected clientId:"+clientId);
    
    });
    

    参考:https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2018-01-09
      • 2023-03-18
      相关资源
      最近更新 更多