Как подключить несколько клиентов socket.io к разным URL-адресам в Node.js?

Я пытаюсь подключить много клиентов socket.io для разных URL-адресов в Node.js, например:

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');

})

Если я использую приведенный выше код, сокет не будет успешно сохранен в переменной sock за время. Это означает, что я должен сделать setInterval около 1000 .. так что

sock=socket 

линия срабатывает.

Помогите пожалуйста мне.


person js123    schedule 23.03.2012    source источник


Ответы (2)


Поскольку при этом в каждом запросе к http://localhost:3000/id вы регистрируете новый обработчик, вы нужно делать это один раз, а не при каждом запросе.

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

    })
});
person Mustafa    schedule 23.03.2012
comment
Да, я это знаю... но какое решение для моего варианта использования? - person js123; 24.03.2012
comment
Ваш подход неверен, вам нужно сохранить отношение id-socket и отправить событие в уважаемый сокет, найдя его с идентификатором запроса. - person Mustafa; 24.03.2012

Я использую следующий подход для достижения этой цели:

сторона клиента:

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

person Neo    schedule 17.09.2013