我的问题如下: 我有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'});
}
});
});
答案 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);
});