我正在使用laravel + socet.io + redis开发聊天应用程序,我使用MYSQL进行商店聊天消息。
所有流程都正常运行。但我面临一个麻烦。 就是这样,
当发件人向聊天室发送消息时,该消息首先存储数据库,然后该消息转到其他客户端认为redis事件。
因此,在这种情况下,一封邮件在发件人侧窗口重复两次。其他客户聊天室工作正常。 下面我为发送者和接收者侧窗口附上两张图片。(*他们在同一个聊天室)
这是我的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')
});
答案 0 :(得分: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);
发送给游戏中的所有客户&#39;房间(频道),发件人除外
socket.broadcast.to('game').emit(channel+":"+message.event,message.data.message);
发送给游戏中的所有客户&#39;房间(频道),包括发件人
io.in('game').emit(channel+":"+message.event,message.data.message);
发送给发件人客户端,只有当他们在游戏中时才会发送给客户。室(信道)
socket.to('game').emit(channel+":"+message.event,message.data.message);
发送给名称空间&#39; myNamespace&#39;中的所有客户,包括发件人
io.of('myNamespace').emit(channel+":"+message.event,message.data.message);
发送给个人socketid
socket.broadcast.to(socketid).emit(channel+":"+message.event,message.data.message);
希望这有帮助