如何检测到您在没有处理程序的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');
});
}
答案 0 :(得分:0)
我没有找到像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}));
答案 1 :(得分:0)
我会这样做,当然是抽象代码......你必须实现所有的监听器和逻辑才能让用户的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
});
});
});
答案 2 :(得分:0)
通过访问套接字对象的内部,可以确定其当前正在侦听的事件。您可以使用此服务器端代码来查看是否正在处理当前消息。
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版进行了测试。