在 laravel 5 中实现简单的 websocket

我需要在Laravel中实现非常简单和非常基本的websocket,以便在我的phonegap应用程序作为客户端和我的Laravel网站作为服务器之间实现数据同步过程。我按照本教程 http://www.binarytides.com/websockets-php-tutorial/ 来实现和测试websocket,它的工作原理。像这样,我需要非常简单的laravel实现,我可以从js客户端调用我的控制器方法。客户端将是我的电话差距应用程序。我在laravel中找到了一些带有教程的websocket包,但我发现很难实现它们。没有人与控制器交互,他们正在侦听事件并在这里和那里创建类,而不是在控制器中。我已经在控制器中编写了我的所有逻辑,并使用ajax请求对其进行了测试,但现在我将通过websocket实现它,因为我需要双向通信来实现同步过程。我是Laravel的新手,所以请给我一些帮助。此外,如果有人能告诉我如何在laravel中集成关于教程,以便客户端可以直接调用控制器发送数据,那就太好了。


答案 1

我最终使用了brainboxlabs的brainsocket(https://github.com/BrainBoxLabs/brain-socket)。正如其文档所说,它的laravel 4软件包,但它也可以与laravel 5一起使用,没有任何问题。

使用 laravel 5 安装此软件包。按照上面的github链接上的文档进行操作。它说要创建事件的地方.php应用程序文件夹中的文件和一些与事件相关的代码。无需此步骤,只需将该事件相关代码添加到应用/提供程序/事件服务提供程序.php文件中。在其引导方法中,添加该代码

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!'));
});

在此步骤之后,有一个步骤添加

require app_path().'/filters.php';
require app_path().'/events.php';

在应用/开始/全局.php 中。您可以将此步骤留给 laravel 5。

好的,所以Web套接字已经实现。您可以通过运行以下命令 ,使用 cmd 启动 websocket 服务器来进行测试。您可以选择为其提供端口工匠大脑插槽:start 9000artisan brainsocket:start

另一个要求是调用控制器来执行其余任务。为此,我直接编辑到提供者包。我不建议这样做,因为这不是一个好方法。当您使用编辑器更新软件包时,您的更改将丢失。所以你必须找到一个更好的选择。但它只是一行变化。

在 vendor\brainboxlabs\brain-socket\src\BrainSocket\BrainSocketServer 中.php我在方法“start”中编辑代码并替换

$this->server = IoServer::factory(
            new HttpServer(
                new WsServer(
                    new BrainSocketEventListener(
                        new BrainSocketResponse(new LaravelEventPublisher())
                    )
                )
            )
            , $port
        );

$this->server = IoServer::factory(
            new HttpServer(
                new WsServer(
               new \FMIS\Http\Controllers\SynchronizationController(
                  new BrainSocketResponse(new LaravelEventPublisher())
                                            )
                )
            )
            , $port
        );

在我的同步控制器文件中。

我在顶部添加了这个

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use BrainSocket\BrainSocketResponseInterface;

实现这样的接口。

class SynchronizationController extends Controller implements MessageComponentInterface{

并实现了此接口的方法。

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();
}

您必须更改这些方法才能实现您的功能。在此之后,您可以从js客户端调用。而且您也不需要使用其js库。您只需使用本教程中描述的js客户端发送数据 http://www.binarytides.com/websockets-php-tutorial/

如果有人需要有关其实施的更多帮助,请告诉我。


答案 2

推荐