套接字.不能停止向所有客户端传递所有数据

Socket.io - Cant stop passing all data to all clients

本文关键字:数据 客户端 不能 套接字      更新时间:2023-09-26

我有一个问题,我正在从数据库通过节点mysql &通过socket.io....表示并传递它但是我遇到了一个问题。

所有用户使用相同的数据更新,而不是每个用户使用唯一的数据更新。

例如:

如果用户A刚刚登录,他可以看到他所有的帐户详细信息。但是当用户B登录后,他可以看到他所有的详细信息....但它随后更新用户A的详细信息以显示用户B的详细信息。

我试图确保用户A只能看到他自己的和用户b相同的

我已经尝试了很多事情来阻止这种情况发生通过JQuery,但似乎不能找到一个解决方案。

下面我将代码精简为一个基本示例:

<a href=""><span id="id-val">User A</span></a>
<a href=""><span id="user-val"></span></a>
服务器端

server = http.createServer(app),
io = require('socket.io').listen(server);
function SQLuserData(userval) {
    connection.getConnection(function (err, connection) {
        connection.query('SELECT val FROM test WHERE name= ?;',
            [userval],
            function (err, rows) {
            var accountval = rows[0]['val'];
            if (accountval) {
                console.log("Val : " + accountval);
                UserVal(accountval);
            } else {
                console.log("Error | Val: " + err);
            }
        });
        connection.release();
    });
}
//Socket.io connection socket
io.sockets.on('connection', function (socket) {
    socket.on('sqluser', function (userval) {
        SQLuserData(userval);
    });
});
//Pass val client side.
function UserVal(accountval) {
    io.sockets.emit("valsocket", accountval);
}
客户端

var socket = io.connect();
//Used to grab information for that user from serverside.
    $(document).ready(function () {
        var userval = $('#id-val').text();
        socket.emit('sqluser', userval);
    });
    //Grabs user value being passed from serverside and updates HTML.
    socket.on("valsocket", function (accountval) {
        $("#user_val").val(accountval);
    });

谁有什么建议或可能的解决方案?

您需要获取并存储每个连接用户的socket.id

var users = {};
//Socket.io connection socket
io.sockets.on('connection', function (socket) {
    socket.on('sqluser', function (userval) {  
        // 'userval' must be unique for each user
        users[userval] = socket.id;
        SQLuserData(userval);
    });
});

,然后使用相同的id向单个套接字

发送数据
//Pass val client side.
function UserVal(accountval, userval) {
    io.sockets.socket(users[userval]).emit("valsocket", accountval);
}

套接字。IO版本1.0及以上

io.to(users[userval]).emit("valsocket", accountval);

我认为您希望避免向所有连接的用户发送帐户数据,这就是Socket。IO的emit方法可以。它可能是更好的客户端发送一个GET请求到服务器,并与帐户的详细信息,以个别客户端响应。

如果您选择通过Socket使用HTTP请求,这里有一些资源。IO:

jQuery得到

表达回应

所以基本上你的代码的问题是你没有区分用户。由于您正在通过套接字发送数据,因此您需要小心发送数据的对象。您可以使用socket -auth来创建一种身份验证类型。然后将数据作为套接字发送。发出(事件、数据);其中socket是每个用户的单独对象。您也可以使用基于cookie的会话来帮助您实现这一点。