2015-02-09 3 views
1

Я рассмотрел несколько ответов здесь, но я думаю, что они относятся к более старым версиям socket.io, поскольку их решения не сработали для меня. Я получаю данные обратно в браузере с, испускающий одиночный клиентский сокет io 1.3.2

io.emit('update', data) 

но это излучающее для всех клиентов так же данные появляются в нескольких окнах, когда я иду в тот же URL. Должен ли я хранить идентификатор клиента где-то после соединения, или я могу просто вернуть его перед выпуском? Пожалуйста, будьте конкретны. Я попробовал несколько других решений от SO, но у меня много идентификаторов ReferenceError не определено или сокетов вместо сокета.

сервер и подключение:

var app = express(); 
var server = require('http').createServer(app) 
var io = require('socket.io')(server) 

app.get('/aPath', function (req, res, next) { 
     res.writeHead(200) 

    var data = { 
     "val1": req.query.val1, 
     "val2": req.query.val2, 
     "val3": req.query.val3, 
     "val4": req.query.val4, 
     "val5": req.query.val5, 
     "val6": req.query.val6, 
    } 

    /*console.log(io.sockets.id)*/ 

    //io.to(io.sockets.id).emit('update', data) 
    //io.sockets.socket(id).emit('update', data) 
    io.emit('update', data) 
    res.end("OK") 
}) 

io.on('connection', function (socket) { 
    console.log('websocket user connected') 
}); 
+0

Вы должны каким-то образом сопоставить спокойного клиента с клиентом сокета. Как только вы это сделаете, вы можете исправить свои данные. –

+0

Я не уверен, что понимаю, что вы имеете в виду, «коррелировать спокойного клиента с клиентом сокета». Можете ли вы объяснить дальше? – user137717

+1

Прочтите мой ответ. в основном убедитесь, что вы знаете, кому клиент третьей стороны отправляет информацию. если вы 1000 активных пользователей, вы хотите отправить их правильному пользователю, поэтому вам необходимо сопоставить правильного пользователя сокета с ответом от стороннего клиента. –

ответ

3

Поскольку клиент стороннего посылает информацию через успокоительный интерфейс, вам нужно будет включать в себя справочные данные для клиента в этом запросе в виде заголовка или строки запроса.

Я предлагаю использовать Redis для хранения активных пользователей сокетов для быстрой справки. Это позволит вам иметь несколько приложений в развертывании, в которых используется сингулярный экземпляр redis для синхронизации данных. Вы также можете сделать то же самое в памяти приложения, но это не очень хорошо масштабируется.

первым, вам необходимо использовать промежуточное программное обеспечение для аутентификации пользователя и кэш socket.id

var app = express(); 
var server = require('http').createServer(app); 
var io = require('socket.io')(server); 
var redis = require('redis'); 

io.use(function(socket, next){ 
    // validate user 
    // cache user with socket.id 
    var userId = validatedUser; 
    socket.handshake.userId = userId; 
    redis.set(userId, socket.id, function (err, res) { 
     next() 
    }); 
}); 

Следующая ручка все сокеты

io.on('connection', function (socket) { 
    console.log('websocket user connected'); 

    //next handle all socket communication 
    socket.on('endpoint', function (payload) { 
     //do stuff 
     socket.emit('endpoint.response', {/*data*/}); 
    }); 

    //Then remove socket.id from cache 
    socket.on('disconnect', function (payload) { 
     //remove user.id from cache 
     redis.del(socket.handshake.userId, function (err, res) { 
      console.log('user with %s disconnected', socket.id); 
     }); 
    }); 
}); 

Обрабатывать события третьей стороны.

app.get('/aPath', function (req, res, next) { 
    // get user from third party 
    var userId = req.query.userId 

    var data = { 
     "val1": req.query.val1, 
     "val2": req.query.val2, 
     "val3": req.query.val3, 
     "val4": req.query.val4, 
     "val5": req.query.val5, 
     "val6": req.query.val6, 
    }; 

    // get cached socketId from userId 
    redis.get(userId, function (err, socketId) { 
     // return ok to third party; 
     res.status(200).send("OK"); 
     only emit if socketid still exists 
     if (err || !socketId) return; 
     // now emit to user 
     io.to(socketId).emit('update', data): 
    }); 
}); 
+0

Я обновил свое сообщение, чтобы включить немного больше контекста для инструкции emit. Третья сторона отправляет запрос на получение и данные в aPath, а затем websocket отправляет обратно подключенному клиенту (а не тот же клиент, который отправил запрос на получение), где данные отображаются. Как я могу получить идентификатор сокета в этом контексте? – user137717

+1

Я уточню свой ответ с некоторыми архитектурными предложениями. –