5

您如何检测到您在没有处理程序的 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');
  });
}
4

3 回答 3

2

通过访问套接字对象的内部,您可以确定它当前正在侦听的事件。您可以使用此服务器端代码来查看是否正在处理当前消息。

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 进行测试。

于 2019-01-17T12:07:09.747 回答
-1

我没有找到像 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}));
于 2017-01-24T21:35:19.373 回答
-1

我会这样做,当然它是抽象代码......你必须实现所有的监听器和逻辑来让用户的 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/

于 2017-01-24T23:14:11.447 回答