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 仅向发送者发送数据包的主要内容,如果未能解决你的问题,请参考以下文章