您如何使用 socket.io 判断哪个套接字连接单击了按钮?

how can you tell which socket connection clicked a button using socket.io?

如果你在页面上有一个按钮,并且你想确保在另一个套接字点击他们的按钮之前不能再次点击该按钮。

如果单击了套接字,我应该禁用该按钮,直到另一个套接字发送一条消息,表明他们单击了他们的按钮并返回和第四次。

$(".buttonTurns").on("click", function(){
        socket.emit("turnbutton click")
})

并且他们在连接时不输入任何名称

您可以为每个客户端(客户端 javascript 或服务器端 javascript)设置一个 UUID。

服务器端解决方案:

正如@slebetman 在评论中提到的那样,socket.io 每个套接字都有一个内置的唯一标识符。

正如@slebetman 在他的回答中所建议的那样,要获取套接字的唯一 ID (),请参阅他的回答以获取更多详细信息:

// v0.6.x
var sid = socket.sessionId;    

// v0.7.x
var sid = socket.id;

客户端解决方案:

如果您在客户端设置唯一 ID,那么您可能需要创建自己的唯一 ID。

我从 6 revs 和 Briguy37 对 a question here on this site 的回答中提取了以下代码:

function generateUUID(){
    var d = new Date().getTime();
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = (d + Math.random()*16)%16 | 0;
        d = Math.floor(d/16);
        return (c=='x' ? r : (r&0x3|0x8)).toString(16);
    });
    return uuid;
};

随机性应该足够强,您的所有客户都可以使用此 ID 生成器获得唯一标识符。这应该适用于您想要使用的关于 .

的代码

每个 socket.io 会话都会自动分配一个唯一的字符串作为 ID。在服务器上,您可以从以下位置获取它:

socket.id

如果您在会话中(即 returns 套接字对象的连接),您只需执行以下操作即可将消息发送回客户端:

socket.emit('event name',data);

但是如果你想向不同的会话发送消息,那么你需要做:

io.sockets.socket(socket_id).emit('event name',data);

如果您想向所有已连接的会话发送消息,只需执行以下操作:

io.emit('event name', data); // broadcast

如果您的应用程序有需要管理的状态,那么一种技术是使用套接字 ID 作为键将它们存储在一个对象中:

var buttonState = {}

io.on('connection',function('socket'){
    // default button to off when socket connects:
    bottonState[socket.id] = 'off';

    socket.on('on button',function(){
        bottonState[socket.id] = 'on';
    })

    socket.on('off button',function(){
        bottonState[socket.id] = 'off';
    })
})

现在您可以管理服务器上每个单独客户端的单独状态,您可以使用它与其他客户端进行通信。