gpt4 book ai didi

mysql - 在聊天室中两次显示发件人消息 socket.io+redis+mysql+laravel

转载 作者:可可西里 更新时间:2023-11-01 11:24:47 27 4
gpt4 key购买 nike

我正在使用 sokcet.io 开发一个实时聊天应用程序,laravel 框架下的 redis 使用 MySQL 数据库连接来保存用户的帽子消息。所以我开发了这个应用程序,但我遇到了一个麻烦。

我的问题是。当我向聊天室发送消息时。该消息在我的(发件人窗口)中显示两次(数据库消息和 Redis 事件消息)。

我尝试了几种方法来解决这个问题,但我仍然找不到合适的解决方案。

如果你能帮我解决这个问题,那对我来说是非常有值(value)的帮助。下面我发布我的编码部分(redis事件+socket连接+message.html+redis Controller )谢谢。

Redis事件:

  class RedisEvent implements ShouldBroadcast{

use Dispatchable, InteractsWithSockets, SerializesModels;
public $message ;
public function __construct(Message $message)
{
$this->message = $message;
}

public function broadcastOn()
{
//return new PrivateChannel('channel-name');

return ['chat'];
}

public function broadcastAs(){
return 'message';
}}

Redis Controller

class RedisController extends Controller{   
public function index()
{
$messages = Message::all();

return view('messages',compact('messages')); }

public function store(Request $request)
{

$messages = Message::create($request->all());
event(
$e = new RedisEvent($messages)
);
return redirect()->back();
}}

服务器.js

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')
});

消息.blade.php

<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 src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js">
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js">
</script>


<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{

}
});

</script>

最佳答案

在你的 RedisController 中改变

event(
$e = new RedisEvent($messages)
);

收件人:

broadcast(new RedisEvent($messages))->toOthers();

这样一来,发件人就无法接收到您正在发送的消息的广播。

阅读更多关于广播的信息 Laravel Doc

关于mysql - 在聊天室中两次显示发件人消息 socket.io+redis+mysql+laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49250864/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com