Node.js Socket.IO重复消息
我正在尝试使用Laravel、NodeJS服务器、socketio和redis构建一个聊天应用程序。我所拥有的是: 客户端JS:Node.js Socket.IO重复消息,node.js,laravel,redis,socket.io,Node.js,Laravel,Redis,Socket.io,我正在尝试使用Laravel、NodeJS服务器、socketio和redis构建一个聊天应用程序。我所拥有的是: 客户端JS: var socket = io('http://localhost:3005'); var room = '17'; $("#send").click(function(){ content = $("textarea").val(); id =$("#id").val(); $.ajax({ url: "{{route('s
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);
});
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');
});
Laravel控制器:
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);
});
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');
});
节点服务器:
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);
});
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号房间广播一条信息。但当我在控制台中收到它时,它会显示它的多个副本,2x-4x。在Laravel控制器中,我使用redis发布消息,并在节点服务器中订阅。接收成功,但问题在于消息的多个副本(客户端)
请问哪里错了?谢谢:)我确信我发现了这个问题,尽管我不得不搜索一些关于这些简单API用法的信息,因为我最近没有使用这个库 看看这本书,很清楚地解释你的问题 这里您正在收听一个新的连接
io.on('connection', function(socket) {
如果客户要求加入特定房间,您可以加入:
socket.on('room', function(room){
socket.join(room);
到目前为止,它就像:
但您的问题在于您的emit,在每个客户端连接上,您都会侦听来自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');
});
为什么要使用PHP和NodeJS,执行AJAX请求来发送客户端消息?作为聊天应用程序,以这种方式发送是没有效率的。因为每个请求都包含头,所以创建一个新的请求作为连接,然后关闭它。你已经有插座了。只需使用emit?他们有一个很好的聊天示例。我执行AJAX,因此数据保存在数据库中。在这种情况下,除了通过AJAX之外,您还会如何接触Laravel的控制器?我期待您的回复。我不熟悉Laravel,但正如我所见,您的Laravel和Nodej都使用相同的redis,对吗?为什么不把你需要的东西简单地保存在nodejs中呢?使用Laravel代码有一个不同的优点?我的主要应用程序是使用Laravel。但回到我的问题上来,它并不能真正回答我为什么会收到重复的消息。有什么原因吗?那么它是否会因为连接的客户端数量而显示重复的消息?我只连接了一个客户。谢谢!它起作用了。我只是对同时使用Redis和Socket IO有点困惑。还是个初学者。