laravel 5中的简单websocket实现



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

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

要使用laravel 5安装此软件包。按照上面github链接上的文档进行操作。它说在应用程序文件夹中创建一个event.php文件和一些与事件相关的代码。不需要执行此步骤,只需在app/Providers/EventServiceProvider.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';

在app/start/global.php中。您可以将此步骤留给laravel 5。

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

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

在vendor \brainboxlabs\brain socket\src\BrainSocket\BrainPacketServer.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 FMISHttpControllersSynchronizationController(
                  new BrainSocketResponse(new LaravelEventPublisher())
                                            )
                )
            )
            , $port
        );

在我的SynchronizationController文件中。

我在顶部添加了这个

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use BrainSocketBrainSocketResponseInterface;

实现了这样的接口。

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 disconnectedn";
}
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/。

如果有人在执行方面需要更多帮助,请告诉我。

相关内容

  • 没有找到相关文章

最新更新