votong/websocket-async

该软件包最新版本(1.0.0)没有可用的许可信息。

Laravel Websocket 基于 Ratchet,支持 pub/sub 功能。

1.0.0 2017-08-28 07:12 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:43:00 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 中发生的任何事情。

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

将触发的事件有

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

服务器端监听器

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

如果 'app/' 文件夹中还没有 events.php,请创建该文件,然后在 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,则必须在发送消息之前完成。