2015-11-02 34 views
14

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

+0

我的建议是在节点服务器下运行Socket.io。 –

+0

我想在客户端使用简单的js套接字。因为它将使用phonegap,所以我想保持简单。 – hassan

+0

实际上使用socket.io会给你一个很少有几行代码的Websocket连接。这就是我个人实现的方式。 –

回答

18

我结束了使用brainboxlabs的brainsocket(https://github.com/BrainBoxLabs/brain-socket)。正如其文档所述,其laravel 4软件包,但它也适用于laravel 5没有任何问题。

用laravel安装此包5.按照上述github链接上的文档。它说在app文件夹中创建一个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'; 

的步骤和/开始/ global.php。你可以离开这一步laravel 5.

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

另一个要求是调用controller来执行其余任务。对于这个我直接编辑到提供程序包。我不推荐这样做,因为这不是一个好方法。当您使用作曲家更新您的软件包时,您的更改将会丢失。所以你必须找到一个更好的选择。但它只是一个改变。

在供应商\ brainboxlabs \脑插座的\ src \ BrainSocket \ BrainSocketServer.php我编辑的方法代码 “开始” 和替换

$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 
     ); 

在我SynchronizationController文件。

我加入这个顶部

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/

让我知道是否有人需要任何更多的帮助其实施。

+0

伙计,令人惊叹的解释。 +1。我想知道是否可以使用控制器而不必实际修改供应商中的文件?这样就可以自由安装laravel更新。谢谢你的帮助。 – Learner

+0

@学习者你可以创建一个扩展brainSocket类的自定义套接字类和命令。不是自己做的,而是看着它,这就是我所要做的。 – sourRaspberri

+0

不幸的是BrainSocket并没有更新他们的源代码来与Laravel 5.5一起工作...... – AmjadoV