Socket.IO复制消息

时间:2018-07-19 19:08:30

标签: node.js laravel redis socket.io

我正在尝试使用Laravel构建一个带有节点js服务器,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);
  });

Laravel控制器:

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中广播消息u i u a a,但是当我在控制台中收到消息时,它会显示它的多个副本,即2x-4x。在Laravel控制器中,我使用Redis发布消息,并在节点服务器中订阅它。接收成功,但是问题出在消息的多个副本(客户端)上。

请问哪里错了?谢谢:)

1 个答案:

答案 0 :(得分:1)

我非常确信我找到了这个问题,尽管我不得不搜索一些有关这些简单API的用法,因为我最近没有使用该库。

看着docs,它可以很清楚地说明您的问题。

您在这里正在收听新的连接,

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

如果客户要求加入特定的房间,您可以加入他:

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

到目前为止,它就像docs

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

但是问题出在每个客户端连接上的发射,您会听到来自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');
  });