Skip to content

Latest commit

 

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Websocket

ZF2 Module. Websocket server build on Ratchet

Instalation

Just require t4web/websocket and add to your application.config.php T4web\Websocket.

Run

In console run

$ php public/index.php websocket start

Configuration

Add in your global.config.php :

't4web-websocket' => [
    'server' => [
        // required
        'port' => 8088,

        // not required, default 0
        'debug-enable' => 1,
    ],
];

Quick usage

For testing create html (or copy from https://github.com/t4web/Websocket/blob/master/ws-test.html):

<html lang="en">
    <body>
        <input type="text" id="input" placeholder="Message…" />
        <hr />
        <pre id="output"></pre>

        <script>
            var host   = 'ws://127.0.0.1:8088';
            var socket = null;
            var input  = document.getElementById('input');
            var output = document.getElementById('output');
            var print  = function (message) {
                var samp       = document.createElement('samp');
                samp.innerHTML = message + '\n';
                output.appendChild(samp);
                return;
            };

            input.addEventListener('keyup', function (evt) {
                if (13 !== evt.keyCode) {
                    return;
                }

                var msg = {
                    'event' : 'ping',
                    'data': {message: input.value}
                };

                if (!msg) {
                    return;
                }

                try {
                    print('Send: ' + JSON.stringify(msg, null, 4));
                    socket.send(JSON.stringify(msg));
                    input.value = '';
                    input.focus();
                } catch (e) {
                    console.log(e);
                }

                return;
            });

            try {
                socket = new WebSocket(host);
                socket.onopen = function () {
                    print('connection is opened');
                    input.focus();
                    return;
                };
                socket.onmessage = function (msg) {
                    print('Receive: ' + JSON.stringify(JSON.parse(msg.data), null, 4));
                    return;
                };
                socket.onclose = function () {
                    print('connection is closed');
                    return;
                };
            } catch (e) {
                console.log(e);
            }
        </script>
    </body>
</html>

Or from PHP:

/** @var \T4web\Websocket\WebsocketClient $wsClient */
$wsClient = $this->getServiceLocator()->get(\T4web\Websocket\Client::class);
$wsClient->send('ping', ['message' => 'Hello World']);

Proposed architecture

Each websocket request message must be json object:

{
    "event": "event-name",
    "data": { "field": "value" }
}

Websocket response message:

{
    "event": "event-name",
    "data": { "field": "value" },
    "error": "string|null"
}

Each websocket request mesage - you can handle. Just describe own handlers in t4web-websocket[event-handlers] module.config.php:

't4web-websocket' => [
    'event-handlers' => [
        // event name => handler - Callable object
        'ping' => Handler\Ping::class,
    ],
],

Handler\Ping :

use SplObjectStorage;
use Ratchet\ConnectionInterface;

class Ping implements T4web\Websocket\Handler\HandlerInterface
{
    public function handle($eventName, array $data, ConnectionInterface $connection, SplObjectStorage $connections)
    {
        $response = [
            'event' => 'pong',
            'data' => $data,
            'error' => null,
        ];
        $connection->send(json_encode($response));
    }
}

About

ZF2 Module. Websocket server

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages