socket.io - 如何访问未处理的消息?
Posted
技术标签:
【中文标题】socket.io - 如何访问未处理的消息?【英文标题】:socket.io - how to access unhandled messages? 【发布时间】:2017-06-04 16:53:47 【问题描述】:您如何检测到您在 socket.io 连接上收到了一条您没有处理程序的消息?
示例:
// client
socket.emit('test', 'message');
// server
io.on('connection', function (socket)
console.log('connection received...');
// logs all messages
socket.conn.on('message', function(data)
console.log('this gets every message.');
console.log('how do I get just the ones without explicit handlers?');
);
socket.on('other' function(data)
console.log('expected message');
);
【问题讨论】:
【参考方案1】:通过访问套接字对象的内部,您可以确定它当前正在侦听的事件。您可以使用此服务器端代码查看当前消息是否正在处理中。
io.on('connection', (socket) =>
console.log('A user connected.');
socket.on('disconnect', () =>
console.log('A user disconnected.');
);
socket.on('chat', (msg) =>
console.log('message: ' + msg);
io.emit('chat', msg);
);
socket.conn.on('message', (msg) =>
if(!Object.keys(socket._events).includes(msg.split('"')[1]))
console.log(`WARNING: Unhandled Event: $msg`);
);
连接后,我将处理两个事件,“断开连接”和“聊天”。之后,我定义了一个处理程序,它使用 socket.conn.on(...) 捕获所有消息。
它接收到的消息将是一个类似于这样的字符串:'2["myEventName","param1","param2"]'
。通过将其沿双引号分开,我们可以获得事件名称。
然后我们窥视socket的内部,找到socket._events的所有键,恰好是事件名称字符串。如果这个字符串集合包含我们的事件名称,那么另一个处理程序会处理它,而我们不必这样做。
您可以在浏览器的控制台中对其进行测试。在那里运行socket.emit('some other event')
,您应该会在服务器控制台中看到您的警告。
重要提示:通常您不应尝试从外部修改任何以下划线开头的对象成员。此外,预计其中的任何数据都是不稳定的。下划线表示它是供该对象、类或函数内部使用的。虽然这个对象不稳定,但它应该是最新的,我们可以使用它,我们不会直接修改它。
在 Chrome 上使用 SocketIO 2.2.0 版进行测试。
【讨论】:
参见 socket.eventNames() - nodejs.org/docs/latest/api/…【参考方案2】:我没有找到像socket.io那样的方法,但是使用一个简单的js函数将消息转换为json它正在做同样的工作。在这里你可以试试这个:
function formatMessage(packetType, data)
var message = 'packetType': packetType, 'data': data
return JSON.stringify(message)
与:
socket.on('message', function(packet)
packet = JSON.parse(packet)
switch (packet.packetType)
case 'init':
...
和
socket.send(formatMessage('init', message));
【讨论】:
【参考方案3】:我会这样做,当然它是抽象代码......你必须实现所有的侦听器和逻辑来让用户的 id 工作
客户
var currentUser =
id: ? // The id of current user
;
var socketMessage =
idFrom: currentUser.id,
idTo: ?, // Some user id value
message: 'Hello there'
;
socket.emit('message', socketMessage);
socket.on('emitedMessage' + currentUser.id, function(message)
// TODO: handle message
);
服务器
io.on('connection', function (socket)
// Handle emit messages
socket.on('message', function(socketMessage)
// With this line you send the message to a specific user
socket.emit('emitedMessage-' + socketMessage.idTo,
from: socketMessage.idFrom,
message: socketMessage.message
);
);
);
更多信息:http://socket.io/docs/
【讨论】:
以上是关于socket.io - 如何访问未处理的消息?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 socket.io-redis 发送私人消息(发射)