Laravel SocketIO не выполняет функции обратного вызова - PullRequest
0 голосов
/ 08 января 2019

Я создал проект Laravel, в котором есть сервер SocketIO, используя Laravel-Ratchet .

<?php
namespace App\Http\Listeners;

use Ratchet\ConnectionInterface;
use Ratchet\MessageComponentInterface;
use Ratchet\Server\IoServer;

class Chat extends IoServer implements MessageComponentInterface {
   protected $clients;

   public function __construct() {
       $this->clients = new \SplObjectStorage;
   }

   /**
    * When a new connection is opened it will be passed to this method
    * @param  ConnectionInterface $conn The socket/connection that just connected to your application
    * @throws \Exception
   */
   function onOpen(ConnectionInterface $conn) {
       echo "someone connected\n";

       $this->clients->attach($conn);

       $conn->send('Welcome!');
   }

   /**
    * This is called before or after a socket is closed (depends on how it's closed).  SendMessage to $conn will not result in an error if it has already been closed.
    * @param  ConnectionInterface $conn The socket/connection that is closing/closed
    * @throws \Exception
    */
   function onClose(ConnectionInterface $conn) {
       echo "someone has disconnected\n";

       $this->clients->detach($conn);
   }

   /**
    * If there is an error with one of the sockets, or somewhere in the application where an Exception is thrown,
    * the Exception is sent back down the stack, handled by the Server and bubbled back up the application through this method
    * @param  ConnectionInterface $conn
    * @param  \Exception $e
    * @throws \Exception
    */
   function onError(ConnectionInterface $conn, \Exception $e) {
        echo "An error has occurred: {$e->getMessage()}\n";

        $conn->close();
   }

   /**
    * Triggered when a client sends data through the socket
    * @param  \Ratchet\ConnectionInterface $from The socket/connection that sent the message to your application
    * @param  string $msg The message received
    * @throws \Exception
    */
    function onMessage(ConnectionInterface $from, $msg) {
       echo "Someone sent a message: {$msg}\n";

       foreach ($this->clients as $client) {
           if ($from !== $client) {
               $client->send('Hello');
           }
       }
    }
}

Который запускается с php artisan ratchet:serve --driver=IoServer -z --class App\\Http\\Listeners\\Chat

На внешнем интерфейсе я работаю с Angular 7 и перепробовал несколько сокетов. Ниже приведена попытка использования socket.io-client

chat.socket.ts:

public ngOnInit():void {
  this.socket = io(
    'http://localhost:8080',
    {
      path: '/'
    }
  );

  this.connection = this.getMessages().subscribe(
    (message:any) => {
      console.log(message);

      this.messages.push(message);
    }
  );
}

public ngOnDestroy(): void {
  this.connection.unsubscribe();
}

getMessages() {
  return new Observable(
    observer => {
      this.socket.on(
        'message',
        (data) => {
          console.log(data);

          observer.next(data);
        }
      );

      return () => {
        this.socket.disconnect();
      };
    }
  );
}

Я также пытался использовать ngx-socket-io с той же проблемой.

chat.socket.ts:

@Injectable()
export class ChatSocket extends Socket {
   constructor() {
     super(
      {
        url: 'http://localhost:8080',
        options: {
          path: '/'
        }
      }
   );
  }
}

chat.page.ts:

public ngOnInit():void {
  this.socket.emit('init');

  this.socket.emit(
    'message',
    'Hello, World',
    function() {
        console.log('here');
     }
   );
 }

Моя вкладка сети показывает, что она запускает ответ, но сразу получает net::ERR_INVALID_RESPONSE без ответа.

Network Request

Вот мои заголовки сокетов:

Socket Headers

При использовании socket-io.client я получаю это после длинной строки сбоев:

enter image description here

Пока это происходит, мой терминал показывает, что я получаю события подключения и отключения, отправленные из приложения. Но сообщения от сервера не принимаются и не перехватываются сервером.

Вот мой журнал:

Starting IoServer server on: 0.0.0.0:8080

someone connected

someone sent a message: GET /chat/?EIO=3&transport=polling&t=MWjzh2Z HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
Origin: http://evil.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
DNT: 1
Referer: http://localhost:8100/chat
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: XDEBUG_SESSION=XDEBUG_ECLIPSE; PHPSESSID=d3c24da76bc02d17a4ae8f7eadeabe07

someone has disconnected

Есть идеи, что не так?

...