Это мой код на стороне клиента:
<script type = "text/javascript">
$(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
}
});
$("#send").click(function(){
content = $("textarea").val();
$.ajax({
url: "{{route('send.message')}}",
method: "POST",
data: {content},
success: function(){
socket.emit('message', content);
}
});
});
});
</script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
<script>
var socket = io('http://localhost:3000');
socket.on("channel:App\\Events\\EventName", function(message){
console.info(message);
});
</script>
Код узла JS:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('channel', function(err, count) {});
redis.on('message', function(channel, message) {
console.info('Message Recieved: ' + message);
message = JSON.parse(message);
io.on('connection', function(socket) {
console.info("made socket connection", socket.id);
});
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.info('Listening on Port 3000');
});
Сторона сервера Laravel PHP (цель ajax):
public function sendMessage(Request $request){
event(new EventName($request->all()));
$message = new Message;
$message->message = $request->content;
$message->save();
}
На стороне клиента он возвращает отправляемые данные, вы можете видеть в socket.on(......), что я пытаюсь сделать, это после того, как сообщение будет отправлено через ajax, я хочу отправить это сообщение с помощью socket.emit() и поймать его в
io.on('connection', fuction(socket)({
});
Но он не может поймать его там. Это почему? Я пытаюсь передать сообщение другим сокетам, кроме моего. Как это, если быть точным
io.broadcast.emit()
Пожалуйста, как мне заставить его работать? Спасибо.
В ответ на @Laravelmeester Привет, извини, у меня мероприятие уже настроено. Но в коде я этого не выкладывал. У меня вот такая проблема:
Когда у меня socket.io прослушивает функцию обратного вызова redis следующим образом:
redis.on('message', function(channel, message) {
console.info(message); //look here
socket.broadcast.emit('message', "huhu");
io.on('connection', function(socket) {
socket.on('message', function(data) {
console.info(data);
socket.broadcast.emit('message', data)
});
});
});
Когда я console.info(message) выводит 3-4x? Почему это так? У меня подключен только один клиент. Так, например, я отправляю
test123
, он выведет
test123
test123
test123






Вам не хватает многих элементов, или, возможно, они у вас есть, но не опубликованы в вашем вопросе.
Я полагаю, вы устроили мероприятие с ремесленником?
php artisan make:event SendSocketMessage
после этого он должен выглядеть примерно так: убедитесь, что вы добавили переменную $ data var в конструкцию и передали ее на правильный канал в broadcastOn ().
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Support\Facades\Log;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class SendSocketMessage implements ShouldBroadcast
{
use SerializesModels;
public $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return ['test-channel'];
}
}
Убедитесь, что у вас запущен сервер Redis, и ваши nodejs правильно настроены и держите терминалы открытыми, чтобы увидеть результаты. Вы видите, что я использовал функцию журнала laravel, потому что вы можете отслеживать свой журнал laravel и тестировать функции construct и broadcatOn, чтобы узнать, проходят ли ваши данные через это событие.
Теперь внутри вашего контроллера, где вы запускаете функцию sendMessage, сверху вам нужно включить App \ Event и имя события следующим образом:
use Event;
use App\Events\SendSocketMessage;
Затем вы переписываете свою функцию следующим образом:
public function sendMessage(Request $request){
Event::fire(new SendSocketMessage($request->all()));
$message = new Message;
$message->message = $request->content;
$message->save();
}
Также console.info в файле message.data во внешнем интерфейсе и посмотрите, ведется он в журнал или нет.
Надеюсь это поможет. Удачи!
-
Пожалуйста, поделитесь тем, что вы получили в журнале консоли, где у вас есть полученное сообщение + параметр сообщения здесь, ваш NodeJS:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('channel', function(err, count) {});
redis.on('message', function(channel, message) {
console.info('Message Recieved: ' + message);
message = JSON.parse(message);
io.on('connection', function(socket) {
console.info("made socket connection", socket.id);
});
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.info('Listening on Port 3000');
});
Это тоже выводит 3-4x?
С вами можно связаться? Может через личное сообщение? @Laravelmeester
Да, вы можете связаться со мной через личные сообщения, не беспокойтесь!
О, глупый я. У меня недостаточно репутации, чтобы создать чат. Не могли бы вы меня пригласить? Спасибо!
Привет, @Laravelmeester, Спасибо за ответ. Взгляните на мой вопрос, я добавил кое-что новое :)