socket.io 仅向发送者发送数据包

Posted

技术标签:

【中文标题】socket.io 仅向发送者发送数据包【英文标题】:socket.io send packet to sender only 【发布时间】:2014-07-28 19:25:20 【问题描述】:

我还没有弄清楚如何使用 socket.io 直接响应发送者

我了解到 io.sockets.emit 发送给所有客户端,但我不会将信息发送回发送者。

代码:

socket.on('login', function (data) 
    db.users.find(username: cc.lowerCase(data.username), function(err, users) 
      if (users.length > 0) 
        users.forEach( function(user) 
          console.log(user.length);
          if (user.password == data.password) 
            io.sockets.emit('login',  username: user.username );
           else 
            io.sockets.emit('error',  message: "Wrong username or password!" );
          
        );
       else 
        io.sockets.emit('error',  message: "Wrong username or password!" );
      
    );
);

【问题讨论】:

【参考方案1】:

当您的服务器侦听时,您通常会在“连接”事件中获得一个套接字:

require('socket.io').on('connect', function(socket)

一个套接字连接两个点:客户端和服务器。当你在这个套接字上发射时,你发射到这个特定的客户端。

例子:

var io = require('socket.io');
io.on('connect', function(socket)
    socket.on('A', function(something)
        // we just received a message
        // let's respond to *that* client :
        socket.emit('B', somethingElse);
    );
);

注意这是两个不同的调用:

socket.emit : 只发射到一个套接字 io.sockets.emit :发射到所有套接字

【讨论】:

出于某种原因,在我的情况下,所有客户端都会收到消息,而不仅仅是发件人。我用一些代码更新了我的帖子。你能看出哪里不对劲吗? @user3577360 不要使用io.sockets.emit,而是使用socket.emit 太棒了!做到了。感谢您的时间和支持。 只要我在socket.on-handler 中使用socket.emit,我就会得到一个unhandled error event。我已经尝试挂钩 socket.on("error", function()) 但无济于事......知道这里发生了什么吗? @Crashalot look here :你可以使用其中一个【参考方案2】:

简单示例

socketio 中的语法令人困惑。此外,每个套接字都会自动连接到 ID 为 socket.id 的自己的房间(这是在 socketio 中进行私人聊天的方式,他们使用房间)。

发送给发件人,而不是其他人

socket.emit('hello', msg);

发送给所有人包括发件人(如果发件人在房间里)在房间“我的房间”

io.to('my room').emit('hello', msg);

发送给所有人除了发件人(如果发件人在房间里)在房间“我的房间”

socket.broadcast.to('my room').emit('hello', msg);

发送给每个房间中的每个人,包括发件人

io.emit('hello', msg); // short version

io.sockets.emit('hello', msg);

仅发送到特定套接字(私人聊天)

socket.broadcast.to(otherSocket.id).emit('hello', msg);

【讨论】:

发送给房间里的每个人,包括发件人 -> io.in(room).emit(/* ... */);【参考方案3】:

迟到总比没有好;)

我有过这样的经历:

io.on('connection', function(socket)
    socket.emit('some event', data);
    socket.on('private event', function(message)
        this.emit('other private event', message);
    

经过一些测试,我意识到“私人事件”闭包中的“this.emit”只发回给发件人。所以我尝试了'this.broadcast.emit',它将消息发送给除发件人之外的所有连接。我相信这就是您想要的代码。

【讨论】:

以上是关于socket.io 仅向发送者发送数据包的主要内容,如果未能解决你的问题,请参考以下文章

如何验证来自 socket.io 的数据包?

如何使用nodejs socket.io向特定房间中的用户发送打字警报和消息

Android 和 Socket.io ,发送和接收数据

在 socket.io 中与握手数据一起发送自定义数据?

在 socket.io 中与握手数据一起发送自定义数据?

使用 Socket.IO 可以多久发送一次数据?