Node.js Socket.IO重复消息

Node.js Socket.IO重复消息,node.js,laravel,redis,socket.io,Node.js,Laravel,Redis,Socket.io,我正在尝试使用Laravel、NodeJS服务器、socketio和redis构建一个聊天应用程序。我所拥有的是: 客户端JS: var socket = io('http://localhost:3005'); var room = '17'; $("#send").click(function(){ content = $("textarea").val(); id =$("#id").val(); $.ajax({ url: "{{route('s

我正在尝试使用Laravel、NodeJS服务器、socketio和redis构建一个聊天应用程序。我所拥有的是:

客户端JS:

var socket = io('http://localhost:3005');
 var room = '17';
  $("#send").click(function(){
    content = $("textarea").val();
    id =$("#id").val();
    $.ajax({
      url: "{{route('send.message')}}",
      method: "POST",
      data: {content, id, room},
      success: function(){
      }
    });
  });

  socket.on('cacad', function(message){
          console.log(message); //multiple copies here
      });

  socket.on('connect', function(){
    console.log("Connected!");
    socket.emit('room', room);
  });
public function sendMessage(Request $request){
 event(new EventName($request->all()));
  $message = new Message;
  $message->message = $request->content;
  $redis = LRedis::connection();
  $redis->publish('chat-channel', json_encode($request->all()));
  $message->save();
}
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var redis = require('ioredis');

var myMessage;
var redis_client = redis.createClient();

redis_client.subscribe('chat-channel');

io.on('connection', function(socket) {

    redis_client.on('message', function(channel, message) {
      var myData = JSON.parse(message);
        socket.broadcast.to('17').emit('cacad', 'u i u a a');
    });


    socket.on('room', function(room){
        socket.join(room);
    });

    socket.on('disconnect', function(){
      console.log("disconnected!");
    });
});


http.listen(3005, function() {
    console.log('Listening on Port 3005');
});
Laravel控制器:

var socket = io('http://localhost:3005');
 var room = '17';
  $("#send").click(function(){
    content = $("textarea").val();
    id =$("#id").val();
    $.ajax({
      url: "{{route('send.message')}}",
      method: "POST",
      data: {content, id, room},
      success: function(){
      }
    });
  });

  socket.on('cacad', function(message){
          console.log(message); //multiple copies here
      });

  socket.on('connect', function(){
    console.log("Connected!");
    socket.emit('room', room);
  });
public function sendMessage(Request $request){
 event(new EventName($request->all()));
  $message = new Message;
  $message->message = $request->content;
  $redis = LRedis::connection();
  $redis->publish('chat-channel', json_encode($request->all()));
  $message->save();
}
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var redis = require('ioredis');

var myMessage;
var redis_client = redis.createClient();

redis_client.subscribe('chat-channel');

io.on('connection', function(socket) {

    redis_client.on('message', function(channel, message) {
      var myData = JSON.parse(message);
        socket.broadcast.to('17').emit('cacad', 'u i u a a');
    });


    socket.on('room', function(room){
        socket.join(room);
    });

    socket.on('disconnect', function(){
      console.log("disconnected!");
    });
});


http.listen(3005, function() {
    console.log('Listening on Port 3005');
});
节点服务器:

var socket = io('http://localhost:3005');
 var room = '17';
  $("#send").click(function(){
    content = $("textarea").val();
    id =$("#id").val();
    $.ajax({
      url: "{{route('send.message')}}",
      method: "POST",
      data: {content, id, room},
      success: function(){
      }
    });
  });

  socket.on('cacad', function(message){
          console.log(message); //multiple copies here
      });

  socket.on('connect', function(){
    console.log("Connected!");
    socket.emit('room', room);
  });
public function sendMessage(Request $request){
 event(new EventName($request->all()));
  $message = new Message;
  $message->message = $request->content;
  $redis = LRedis::connection();
  $redis->publish('chat-channel', json_encode($request->all()));
  $message->save();
}
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var redis = require('ioredis');

var myMessage;
var redis_client = redis.createClient();

redis_client.subscribe('chat-channel');

io.on('connection', function(socket) {

    redis_client.on('message', function(channel, message) {
      var myData = JSON.parse(message);
        socket.broadcast.to('17').emit('cacad', 'u i u a a');
    });


    socket.on('room', function(room){
        socket.join(room);
    });

    socket.on('disconnect', function(){
      console.log("disconnected!");
    });
});


http.listen(3005, function() {
    console.log('Listening on Port 3005');
});
我正试图在17号房间广播一条信息。但当我在控制台中收到它时,它会显示它的多个副本,2x-4x。在Laravel控制器中,我使用redis发布消息,并在节点服务器中订阅。接收成功,但问题在于消息的多个副本(客户端)


请问哪里错了?谢谢:)

我确信我发现了这个问题,尽管我不得不搜索一些关于这些简单API用法的信息,因为我最近没有使用这个库

看看这本书,很清楚地解释你的问题

这里您正在收听一个新的连接

io.on('connection', function(socket) {
如果客户要求加入特定房间,您可以加入:

socket.on('room', function(room){
    socket.join(room);
到目前为止,它就像:

但您的问题在于您的emit,在每个客户端连接上,您都会侦听来自redis的消息。然后,通过连接的客户端的发射将其广播到房间

相反,您可以这样做:

io.on('connection', function(socket) {
    socket.on('room', function(room){
        socket.join(room);
    });

    socket.on('disconnect', function(){
      console.log("disconnected!");
    });
});

redis_client.on('message', function(channel, message) {
    var myData = JSON.parse(message);
      io.to('17').emit('cacad', 'u i u a a');
  });

为什么要使用PHP和NodeJS,执行AJAX请求来发送客户端消息?作为聊天应用程序,以这种方式发送是没有效率的。因为每个请求都包含头,所以创建一个新的请求作为连接,然后关闭它。你已经有插座了。只需使用emit?他们有一个很好的聊天示例。我执行AJAX,因此数据保存在数据库中。在这种情况下,除了通过AJAX之外,您还会如何接触Laravel的控制器?我期待您的回复。我不熟悉Laravel,但正如我所见,您的Laravel和Nodej都使用相同的redis,对吗?为什么不把你需要的东西简单地保存在nodejs中呢?使用Laravel代码有一个不同的优点?我的主要应用程序是使用Laravel。但回到我的问题上来,它并不能真正回答我为什么会收到重复的消息。有什么原因吗?那么它是否会因为连接的客户端数量而显示重复的消息?我只连接了一个客户。谢谢!它起作用了。我只是对同时使用Redis和Socket IO有点困惑。还是个初学者。