簡體   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