Для получения полного доступа
зарегистрируйтесь

Приём сообщений от сервера через WebSocket


Сразу покажу демо:

l41m5gGukcDpZa2MU.gif

В качестве фреймворка используем Yii2, для работы с веб-сокетами Ratchet.

Добавляем через composer Ratchet:

composer require cboden/ratchet

Затем, создаём контроллер в папке commands для запуска сервера:

public function actionIndex() {
    $server = IoServer::factory(
        new HttpServer(
            new WsServer(
                new Messenger()
            )
        ),
        8080
    );
    $server->run();
} 

Перейдём к js, нам нужно создать объект для работы с сокетами, например, так:

var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function (result) {
    console.log(result);
};

conn.onmessage = function (result) {
    console.log(result);
};  

Добавим кнопку для отправки сообщения:

<input onclick="conn.send('Hello!');" type="button" value="Say Hello!"> 

И затем, создаём в папке components сам сервер, именно он будет принимать / отправлять сообщения:

<?php

namespace app\components;

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Yii;

/**
 * Class Server
 * @package app\components
 */
class Server implements MessageComponentInterface {

    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;

    }

    /**
     * @param ConnectionInterface $conn
     */
    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "Новое соединение ({$conn->resourceId})\n";
    }

    /**
     * @param ConnectionInterface $from
     * @param string              $msg
     */
    public function onMessage(ConnectionInterface $from, $msg) {
        // Принимаем сообщение от клиента
        echo "{$from->resourceId} say: {$msg}\n";

        foreach ($this->clients as $client) {
            if ($from !== $client) {
                // Делаем рассылку всем клиентам
                if ($msg === 'Hello!') {
                    $client->send('Hi!');
                }
            }
        }
    }

    /**
     * @param ConnectionInterface $conn
     */
    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Пользователь {$conn->resourceId} отключился\n";
    }

    /**
     * @param ConnectionInterface $conn
     * @param \Exception          $e
     */
    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Произошла ошибка: {$e->getMessage()}\n";
        $conn->close();
    }
}

Чтобы увидеть комментарии, нужно быть участником сообщества

Регистрация