从一个客户端向另一个socket.io发送响应消息时出现问题

时间:2020-01-24 21:11:25

标签: javascript node.js socket.io

我的问题如下: 我有2个通过套接字服务器进行通信的应用程序。 App1通过message事件将消息发送到app 2。这可以正常运行,因为应用2正确地获得了消息,我要做的是从应用2向1发送另一条回复消息,以警告消息到达正确。为此,我有一个名为estado_mensaje的事件,该事件在消息事件中发出,并且在服务器上,当侦听此事件时,它会发出mensaje_ok事件,在服务器控制台中可以正常显示,但是我无法在应用程序1中获得该消息。这是我的代码:

服务器节点

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 4444;

app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});

UserOnId=new Array();
IdsOnUser=new Array();
io.on('connection', function(socket){

socket.on('datos_usuario', function(datos){
 id_socket=socket.id;
 usuario=datos.username;
 UserOnId[id_socket]=usuario;

 if(IdsOnUser[usuario]==null){
  IdsOnUser[usuario]=new Array();
 }
 IdsOnUser[usuario].push(id_socket);

console.log('------usuarios por id_socket------');
console.log(UserOnId);
console.log('------IDs socket por usuarios------');
console.log(IdsOnUser);
console.log('Cantidad de usuarios en lineas');
console.log(Object.keys(IdsOnUser).length);
 io.emit('nuevo_usuario', datos);

});


socket.on('message', function(datos){

  if(datos.user_to!=''){
      destinatario=datos.user_to;
      if(IdsOnUser[destinatario]){
          id_onlines=IdsOnUser[destinatario];
          for (var i=0;i<id_onlines.length;i++){
              io.to(id_onlines[i]).emit('message', datos);
          }
          io.to(socket.id).emit('message', datos);
      }

  }else {
      io.emit('message', datos);
  }
    console.log(datos.contenido);


});


socket.on('estado_mensaje ', function(datos){

    console.log(datos);
    io.emit('ok_mensaje', datos);

});

App1

var socket = io();
$(function () {


    $('form').submit(function(){
        var id_usuario_logueado=$('#id_username').val();
        var usuario_logueado=$('#username').val();
        var id_user_to=$('#id_receptor').val();
        var user_to=$('#receptor').val();
        datos={id_user_from:id_usuario_logueado,user_from:usuario_logueado,id_user_to:id_user_to,user_to:user_to,contenido:$('#m').val()};
        /*Envia un mensaje a traves del canal message*/
        socket.emit('message', datos);
        $('#m').val('');
        return false;
    });

    socket.on('message', function(datos){
        $('#messages').append($('<li>').text(datos.user_from+':'+datos.contenido));
        console.log(datos);
        window.scrollTo(0, document.body.scrollHeight);

    });

    socket.on('nuevo_usuario', function(datos){

        console.log('Usuario logueado: '+datos.username);
        var usuario_logueado=$('#usuario_logueado').val(datos.username);

    });

    socket.on('ok_mensaje ', function(datos){

        alert('llega la respuesta');
        console.log(datos);


    });

});
function loguear(){
    var username=$('#username').val();
    socket.emit('datos_usuario', {username:username});
}

App2

socket.on('message', function(datos){
    $.ajax({
    url: "index.php?route=administracion/chat/send_message&token=" + token,
    type: 'POST',
    dataType: 'json',
    async:true,
    data:{ id_user_from : id_user_from,id_user_to: id_user_to },
    success: function (json) {
      /*Here is how I emit the response to the other app*/
       socket.emit('estado_mensaje ', {status:'sucess'});
       console.log('guarda bien');
    },
    error: function(json){
        console.log('guarda mal');
        socket.emit('estado_mensaje ', {status:'error'});

    }
});
});

1 个答案:

答案 0 :(得分:1)

您的邮件名略有不符。

按顺序延迟,服务器将执行以下操作:

io.emit('ok_mensaje', datos);

但是app1正在这样做:

socket.on('ok_mensaje ', function(datos){ ...});

查看一个消息名称末尾有一个空格,而另一个则没有。它们不匹配。在我看来,在您的消息末尾放置空格的整个概念对我来说似乎很可怕。如果要区分邮件,请使用前导下划线或前缀,例如ok_或其他非常明显的字符,而不是像尾随空格那样细微的字符。

仅供参考,以下是发生的事情的序列,有时这是您必须调试的方式,以便将实际序列解包为可轻松遵循的顺序代码集。这就是我发现上述问题的方式:

// client (app1)
socket.emit('message', datos);

// server
socket.on('message', function(datos){

    // ...
    for (var i=0;i<id_onlines.length;i++){
        io.to(id_onlines[i]).emit('message', datos);
    }   
    io.to(socket.id).emit('message', datos);

});

// client (app2)
socket.on('message', function(datos){
    socket.emit('estado_mensaje ', {status:'sucess'});
});

// server
socket.on('estado_mensaje ', function(datos){
    console.log(datos);
    io.emit('ok_mensaje', datos);
});

// *** Everything works up to here ***
// *** the next part does not work ***

// client (app1)

socket.on('ok_mensaje ', function(datos){
    alert('llega la respuesta');
    console.log(datos);
});