我正在尝试使用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发布消息,并在节点服务器中订阅它。接收成功,但是问题出在消息的多个副本(客户端)上。
请问哪里错了?谢谢:)
答案 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');
});