votong/websocket

基于Ratchet的Laravel WebSocket服务器

v1.0.1 2014-11-29 13:40 UTC

This package is not auto-updated.

Last update: 2024-09-29 01:45:59 UTC


README

基于Ratchet的WebSocket服务器。设计为完全事件驱动,因此可以在多个不同项目中使用,而无需修改基本代码。

安装

在项目的 composer.json 文件中添加 requirerepositories 信息

"require": {
        ...
        "freestream/websocket": "1.*"
        ...
    },
    "repositories": [
        ...
        {
            "type": "vcs",
            "url": "git@github.com:freestream/laravel-websocket.git"
        }
        ...
    ],

现在,在终端中运行 composer update

更新完成后,需要在 app/config/app.php 文件中的 providers 数组中注册服务提供者

'Freestream\WebSocket\WebSocketServiceProvider',

服务器端配置

在项目的根目录中运行以下命令以启动WebSocket服务器。默认情况下,服务器将在端口8080上运行,但可以通过在命令末尾添加 --port=[number] 来更改到任何所需的端口。

php artisan websocket:start

这将启动一个守护进程服务,该服务将建立WebSocket服务器。为了确保该命令持续运行,建议使用 Supervisord 来监控守护进程。

客户端监听器

此服务包含必要的JavaScript。要将这些包含到项目的资源文件夹中,请运行以下命令。

php artisan asset:publish freestream/web-socket

之后,将以下行添加到模板文件中。

<script type="text/javascript" src="{{ URL::asset('packages/freestream/web-socket/js/WebSocketClient.js') }}"></script>

要建立WebSocket客户端,请添加以下代码。

<script type="text/javascript">
    var webSocketClient = new WebSocketClient({
        prefix: 'Custom.Event.Prefix',
        server: 'localhost',
        port: '8080',
    });
</script>

可用的配置如下

debug       boolean     Enabled debug messages in browser console. Default is false.
prefix      string      Event firing prefix. Default 'Laravel.Freestream.WebSocket'
server      string      WebSocket server address. Default 'localhost'
port        integer     WebSocket server port. Default 8080
sessionId   string      Session ID for the opened WebSocket. Default random integer.
reconnect   boolean     Should reconnect automatically if losing connection. Default true.

一旦建立连接,就可以通过socket发送消息。第一个参数是一个事件名称,它将被发送到后端作为跟踪事件以便更容易过滤。第二个参数是消息,可以是字符串或JSON。

<script type="text/javascript">
    webSocketClient.message('event-name', 'This is my message');
</script>

从服务器发送回客户端的消息包含一个包含两个元素的JSON,即 origDatadata。OrigData包含任何已发送的消息以及服务器已响应的数据,而data包含来自服务器的响应数据。

{
    origData: {
        ...
    },
    data: {
        ...
    },
}

将事件监听器添加到WebSocket中,以响应/监听WebSocket中发生的任何事件。

document.addEventListener('Laravel.Freestream.WebSocket.Message.Received', function(event) {});

将触发的事件是

[PREFIX].Error
[PREFIX].Message.Received
[PREFIX].Connection.Established
[PREFIX].Connection.Closed

服务器端监听器

服务器需要能够响应客户端发送的任何新连接或消息。这是通过Laravel的事件监听器完成的。这可以通过不同的方式设置,但推荐的方式是使用 events.php

如果 events.php 还未在 'app/' 文件夹中,请创建该文件,然后打开 'app/start/global.php' 并确保以下行在文件末尾。

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

现在应该将所有将由服务器处理的事件放在 events.php 中。

<?php
Event::listen('Laravel.Freestream.WebSocket.Listener.Open', function($connection, $clients, $listener){
    ...
});

Event::listen('Laravel.Freestream.WebSocket.Listener.Open.After', function($connection, $clients, $listener){
    ...
});

Event::listen('Laravel.Freestream.WebSocket.Listener.Message', function($from, $raw, $clients, $listener) {
    ...
});

Event::listen('Laravel.Freestream.WebSocket.Listener.Close', function($connection, $clients, $listener) {
    ...
});

$connection$from(取决于事件)有以下功能。

setSessionId('id')
setEvent('name')
send('string')

send 函数将消息发送到客户端。如果需要指定事件或sessionId,必须在发送消息之前完成此操作。