【问题标题】:show chat message two times on the sender side Broadcast to others在发送方显示两次聊天消息 广播给其他人
【发布时间】:2018-08-23 21:02:57
【问题描述】:

我正在使用 laravel+socet.io+redis 开发一个聊天应用程序,并且我使用 MYSQL 来存储聊天消息。

所有进程都正常运行。但我面临一个麻烦。 也就是说,

当发件人向聊天室发送消息时,该消息首先存储数据库,然后该消息转到其他客户端认为 redis 事件。

因此,在这种情况下,一条消息在发送方窗口重复两次。其他客户聊天室正常工作。 下面我附上发送方和接收方窗口的两张图片。(*它们在同一个聊天室)

Sender side window

Receiver side window

这是我的 HTML,redis+nodeserver 编码部分

<html>
  <body>

   <div id="data">
     @foreach($messages as $message)
     <p id="{{$message->id}}">database_<strong>{{$message->Sender}}
   </strong>: 
     {{$message->MessageTxt}}</p>
     @endforeach
   </div>

  <div>
  <form action="sendMessaged" method="POST">
{{csrf_field()}}
Name: <input type="text" name="Sender">
<br>
<br>
Content: <textarea name="MessageTxt" rows="5" style="width:100%">
</textarea>
<button type="submit" name="send">Send</button>
 </form>

 <script>
    var socket = io('http://localhost:6001');
     socket.on('chat:message',function(data){
      console.log(data)       

       if($('#'+data.id).length == 0){
        $('#data').append('<p>else__<strong>'+data.Sender+'</strong>: '+data.MessageTxt+'</p>')
    }
    else{

    }
});     

    var io = require('socket.io')(6001);
    console.log('Connected to port 6001');
    io.on('error',function(socket){
    console.log('error')
    });
var Redis = require('ioredis');
var redis = new Redis(1000);
 redis.psubscribe("*",function(error,count){
});

io.on('connection',function(socket){
 console.log('coonected with'+socket.id)
});
redis.on('pmessage',function(partner,channel,message){

message = JSON.parse(message);
socket.emit(channel+":"+message.event,message.data.message);
console.log('Sent')
});

【问题讨论】:

  • 您必须在客户端执行此操作,因为两者之间涉及代理
  • 我实现了一个 API 用于连接到客户端。所以我如何处理它

标签: node.js laravel redis


【解决方案1】:

将此行改为

socket.emit(channel+":"+message.event,message.data.message);

到这里

socket.broadcast.emit(channel+":"+message.event,message.data.message);

为了您的信息,我列出了所有可能的场景

只发送给发送者-客户端

socket.emit(channel+":"+message.event,message.data.message);

发送给所有客户端,包括发件人

io.emit(channel+":"+message.event,message.data.message);

发送到“游戏”房间(频道)中的所有客户端,发送者除外

socket.broadcast.to('game').emit(channel+":"+message.event,message.data.message);

发送给“游戏”房间(频道)中的所有客户端,包括发送者

io.in('game').emit(channel+":"+message.event,message.data.message);

发送给发送者客户端,仅当他们在“游戏”房间(频道)中时

socket.to('game').emit(channel+":"+message.event,message.data.message);

发送到命名空间“myNamespace”中的所有客户端,包括发件人

io.of('myNamespace').emit(channel+":"+message.event,message.data.message);

发送到单独的socketid

socket.broadcast.to(socketid).emit(channel+":"+message.event,message.data.message);

希望对你有帮助

【讨论】:

  • levaral 感谢您的帮助。我尝试这些方式。但同样的问题,
  • @androidpc 正如我已经告诉你的那样......你在代理后面,所以你必须在客户端这样做
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多