发送给启动请求socket.io的特定客户端。在路由器中获得socketid

时间:2016-05-11 06:47:47

标签: javascript node.js sockets socket.io

我有以下 app.js

var express = require('express');
var app = express();
// var responseHandlerRouter = require('./routes/responseHandlerRouter.js');

routes = require('./routes');

var server = app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

io = require('/usr/local/lib/node_modules/socket.io').listen(server);

app.use('/', routes(io));

routes.js

var express = require('express');
var router = express.Router();

module.exports = function (io) {

    // all of this router's configurations

    router.get('/login', function (req, res, next) {
        io.emit('notification', 'news');
        res.end('well finally I am here');
    });

    return router;

}

的index.html

<!doctype html>
<html>
    <head>
        <script src="http://127.0.0.1:3000/socket.io/socket.io.js"></script>
        <script>

        var socket = io.connect('http://localhost:3000/login');

        socket.on('notification', function (data) {
            console.log(data);
        });
        </script>
    </head>
    <body>
        <ul id='messages'></ul>
    </body>
</html>

当我点击URL时,它会发出字符串&#39; news&#39;到浏览器,但它发送给所有客户端。如果我打开多个浏览器,它将发送给所有客户端。如何向特定客户发出?或者如何才能将socketid放入路由器内部。是否可以使用io对象?

1 个答案:

答案 0 :(得分:0)

您可能需要在此处重新考虑您的设计。通常,您可以从connect事件

获取对特定客户端的引用
io.on('connection', function(socket) {
    socket.emit('Hello World');
}

在你的情况下,你传递了对整个io对象的引用。您可能需要设置一种方法来处理连接事件,并在套接字句柄和客户端ID之间创建一个映射(JS中的数组)。然后,您可以通过路由器中req参数的某种标识符从地图中引用套接字句柄。

就个人而言,我从未使用过socket.io的路由器,并建议使用命名空间或房间。