繁体   English   中英

Laravel的socket.io无法捕获连接

[英]socket.io with Laravel not catching connection

这是我的客户端代码:

 <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.log(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.log('Message Recieved: ' + message);
    message = JSON.parse(message);

    io.on('connection', function(socket) {
        console.log("made socket connection", socket.id);
    });

    io.emit(channel + ':' + message.event, message.data);
});

http.listen(3000, function() {
    console.log('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.log(message); //look here
    socket.broadcast.emit('message', "huhu");
    io.on('connection', function(socket) {
        socket.on('message', function(data) {
            console.log(data);
            socket.broadcast.emit('message', data)
        });
    });
});

当我console.log(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 log函数,因为您可以拖尾laravel日志并测试Construct函数和broadcatOn函数,以查看您的数据是否来自此事件。

现在,在您的控制器中,在其中触发sendMessage函数的顶部,您需要包括App \\ Event和eventname,如下所示:

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.log 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.log('Message Recieved: ' + message);
    message = JSON.parse(message);

    io.on('connection', function(socket) {
        console.log("made socket connection", socket.id);
    });

    io.emit(channel + ':' + message.event, message.data);
});

http.listen(3000, function() {
    console.log('Listening on Port 3000');
});

那还会输出3-4x吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM