【问题标题】:how can you tell which socket connection clicked a button using socket.io?你怎么知道哪个套接字连接使用socket.io点击了一个按钮?
【发布时间】:2015-08-10 04:22:53
【问题描述】:

如果您在页面上有一个按钮,并且您想确保在另一个套接字单击其按钮之前不能再次单击该按钮。

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

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

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

【问题讨论】:

  • 我认为线程有你一直在寻找的答案,想法是保存每个客户端的套接字 id,你可以通过 io.sockets.socket(savedSocketId).emit( ...)。

标签: javascript jquery sockets socket.io


【解决方案1】:

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

socket.id

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

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';
    })
})

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

【讨论】:

    【解决方案2】:

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

    对于服务器端解决方案:

    正如@slebetman 在 cmets 中提到的,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 生成器拥有唯一标识符。这应该适用于您想要使用的关于 your question here 的代码。

    【讨论】:

    • 这不是必需的,因为 socket.io 已经为每个套接字分配了一个唯一的字符串作为 id。
    • @slebetman 谢谢,我不知道。等我到电脑前,我会尽快更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多