php - websockets - Implementación websocket simple en laravel 5
websocket php example (1)
Necesito implementar un websocket muy simple y muy básico en Laravel para implementar el proceso de sincronización de datos entre mi aplicación phonegap como cliente y mi sitio web Laravel como servidor. Seguí este tutorial http://www.binarytides.com/websockets-php-tutorial/ para implementar y probar websocket y funciona. Como esta, necesito una implementación de laravel muy simple donde pueda llamar a mi método de controlador desde el cliente js. El cliente será mi aplicación de phonegap. Encontré algunos paquetes para websocket en laravel con tutoriales, pero me resultó difícil implementarlos. Nadie interactuaba con los controladores, escuchaban los eventos y creaban clases aquí y allá, pero no en los controladores. Escribí toda mi lógica en el Controlador y la probé con una solicitud ajax, pero ahora la implementaré por websocket porque necesito comunicación bidireccional para implementar el proceso de sincronización. Soy nuevo en Laravel, así que por favor, ayúdame. También será muy bueno si alguien me puede decir cómo integrar el tutorial sobre laravel para que el cliente pueda llamar directamente al controlador para enviar datos.
Terminé usando el cerebro de brainboxlabs ( https://github.com/BrainBoxLabs/brain-socket ). Como dice su documento, su paquete laravel 4, pero también funciona con laravel 5 sin ningún problema.
Para instalar este paquete con laravel 5. Siga la documentación en el enlace de github anterior. Donde dice crear un archivo event.php en la carpeta de la aplicación y algún código relacionado con eventos. En lugar de este paso, simplemente agregue el código relacionado con el evento en el archivo app / Providers / EventServiceProvider.php. En su método de arranque, agregue ese código que es
Event::listen(''generic.event'',function($client_data){
return BrainSocket::message(''generic.event'',array(''message''=>''A message from a generic event fired in Laravel!''));
});
Event::listen(''app.success'',function($client_data){
return BrainSocket::success(array(''There was a Laravel App Success Event!''));
});
Event::listen(''app.error'',function($client_data){
return BrainSocket::error(array(''There was a Laravel App Error!''));
});
Después de este paso hubo un paso de añadir.
require app_path().''/filters.php'';
require app_path().''/events.php'';
en la aplicación / inicio / global.php. Puedes dejar este paso para laravel 5.
Ok, entonces se ha implementado web socket. Puede probar iniciando el servidor websocket usando cmd ejecutando el comando artisan brainsocket:start
. Opcionalmente, puede proporcionar el puerto artesanal brainsocket: start 9000
Otro requisito era llamar al controlador para realizar el resto de la tarea. Para esto he editado directamente en el paquete del proveedor. No lo recomiendo ya que no es una buena manera. Cuando actualices tu paquete utilizando Composer, tus cambios se perderán. Así que tienes que encontrar una mejor opción. Pero es solo un cambio de una línea.
En el proveedor / brainboxlabs / brain-socket / src / BrainSocket / BrainSocketServer.php, edité el código en el método "iniciar" y reemplazar
$this->server = IoServer::factory(
new HttpServer(
new WsServer(
new BrainSocketEventListener(
new BrainSocketResponse(new LaravelEventPublisher())
)
)
)
, $port
);
con
$this->server = IoServer::factory(
new HttpServer(
new WsServer(
new /FMIS/Http/Controllers/SynchronizationController(
new BrainSocketResponse(new LaravelEventPublisher())
)
)
)
, $port
);
Y en mi archivo SynchronizationController.
Agregué esto en la parte superior
use Ratchet/MessageComponentInterface;
use Ratchet/ConnectionInterface;
use BrainSocket/BrainSocketResponseInterface;
Interfaz implementada como esta.
class SynchronizationController extends Controller implements MessageComponentInterface{
e implementado los métodos de esta interfaz.
public function __construct(BrainSocketResponseInterface $response) {
$this->clients = new /SplObjectStorage;
$this->response = $response;
}
public function onOpen(ConnectionInterface $conn) {
echo "Connection Established! /n";
}
public function onMessage(ConnectionInterface $conn, $msg){
echo "this messge gets called whenever there is a messge sent from js client";
}
public function onClose(ConnectionInterface $conn) {
echo "Connection {$conn->resourceId} has disconnected/n";
}
public function onError(ConnectionInterface $conn, /Exception $e) {
$msg = "An error has occurred: {$e->getMessage()}/n";
echo $msg;
$conn->close();
}
Tienes que cambiar en estos métodos para implementar tu funcionalidad. Después de esto puede llamar desde su cliente js. Y no está obligado a utilizar su biblioteca js también. Simplemente envíe los datos utilizando js client describe en este tutorial http://www.binarytides.com/websockets-php-tutorial/ .
Déjame saber si alguien necesita más ayuda con respecto a su implementación.