2012-03-12 2 views
1

Я новичок в nodejs и экспериментировал с socket.io. Я пытаюсь отправить сообщение в определенные сокеты, поэтому я думал, что буду хранить ссылки на сокет.Ссылка на сокет в Socket.IO

var controls = {}; 
var clients = {}; 

var control = io 
    .of("/control") 
    .on("connection", function(socket){ 
    socket.on("connect_player", function(data){ 
     var id = data.screen_id; 
     controls[socket.id] = id; 
    }); 

    socket.on("msg", function(data){ 
     id = controls[socket.id] 
     player.socket(clients[id]).emit("msg", data); 
    }); 
    }); 

var player = io 
    .of("/player") 
    .on("connection", function(socket){ 
    socket.on("set_id", function(id){ 
     clients[id] = socket.id 
    }); 
    }); 

я сначала начать веб-страницы, который подключается к «игрок» пространства имен и отображает идентификатор (жестко). Затем другая веб-страница, которая соединяется с пространством имен «control» с тем же идентификатором, что и игрок, теперь контроллер должен иметь возможность отправлять сообщения этому конкретному игроку, но это работает некоторое время, а затем сбой.

В течение периода, когда он работает, я могу отправлять сообщения с управляющей страницы на определенную страницу игрока.

Я просмотрел идентификаторы сокетов в пространстве имен проигрывателя после того, как он прекратил работать, и обнаружил, что идентификаторы сокетов отличаются от исходных.

Я думаю, что я что-то делаю неправильно или неправильно понимаю понятия. Как я могу исправить эту проблему.

изменение:

Я добавил слушатель для «воссоединиться» события и обнаружил, что значение socket.id изменений после каждый, «восстановить» событие. Таким образом, элементы управления и клиенты имеют недопустимые значения socket.id, которые приводят к моей проблеме. Есть ли это, чтобы преодолеть это.

ответ

4

Нового socket.io поддерживает номера. Так как насчет этого? Для каждого соединения установите уникальный идентификатор для этого соединения (например, уникальное имя пользователя - это отлично работает вместе с сеансом - или что угодно). Затем вы можете использовать

io.on('connection', function(socket) { 
    // retrieve the ID from socket 
    socket.join('/priv/'+ID); 
}); 

Затем вы можете сделать следующее msg обработчика:

// get the ID 
io.sockets.in('/priv/'+ID).emit("msg", data); 

На этом этапе вы можете быть уверены, что сообщение пошел к пользователю требуется. Конечно, вам нужно убедиться, что идентификатор не изменится при повторном подключении клиента. Как я уже упоминал ранее, это можно сделать, отправив cookie сеанса на сервер и извлекая идентификатор из сеанса.

И я думаю, что это единственно приемлемое решение, потому что клиент может повторно подключаться много раз, и вы хотите, чтобы другие клиенты переучивали этот конкретный клиент, например, (уникальным) именем.

+0

Я отредактировал мой вопрос. Проблема, с которой я столкнулась, связана с тем, что я использую socket.id как ссылку, которая, кажется, меняется после повторного подключения. – Josnidhin

+0

Точно. Вот почему я советую не использовать его. Для каждого клиента определите и установите свой собственный идентификатор и используйте комнаты для поддержки личных сообщений. – freakish

+0

По моему опыту, вы должны использовать RedisStore для использования функции «Комната». Поскольку Socket.io использует подписку Redis, функцию отмены подписки для реализации «Room» – InspiredJW

1

Не могли бы вы попробовать установить тактовый интервал,

io.set('heartbeat interval', 20); 
io.set('heartbeat timeout', 60); 
+0

Я не думаю, что это поможет мне. Я попробовал, и ничего не изменилось. Спасибо за предложение. – Josnidhin

+0

Какую версию socket.io вы используете? – almypal

+0

последняя версия v0.9 – Josnidhin

Смежные вопросы