Сегодня я покажу вам, как создать чат с помощью WebSockets и PHP Backend. Клиентская сторона может быть чем угодно (веб-сайт, приложение для Android, iOS и т. д.). В этой статье я покажу вам, как создать базовый веб-клиент.

Сервер

Начнем сборку серверной части. Сервер отвечает за размещение всех соединений и отправку сообщений соединениям.

Мне не нравится работающий на сервере JavaScript, поэтому я решил написать сервер на PHP. Мы не должны строить все сами. Есть PHP-библиотека под названием Ratchet, которая может сделать за нас тяжелую работу.

Создайте файл composer.json и запустите «composer install», это установит все необходимые зависимости, необходимые для запуска сервера сокетов.

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4",
        "ext-json": "*"
    }
}

Далее нам нужно добавить несколько строк кода для инициализации сервера. Создайте папку с именем «src» или что-то другое, что вы определили в composer.json, и другую папку с именем «bin».

Во-первых, мы начинаем с кода в «bin». Этот файл вызывается для запуска сервера. Или, скажем, это сервер.

Создайте файл «server.php» в «bin» и вставьте в него следующий код.

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);
$server->run();

Всякий раз, когда вы запускаете этот сценарий, вы запускаете сервер, работающий на порту 8080 на вашем компьютере.

В коде вы можете увидеть «новый чат ()» и оператор использования «использовать MyApp\Chat;» это класс, который мы должны определить сами.

Поместите файл «Chat.php» в «src». Этот файл является наиболее интересной частью сценария сервера. Это абсолютно базовый скрипт без каких-либо особенностей. Он просто отправляет сообщения всем другим соединениям. Вам придется написать больше кода для разработки таких вещей, как чат-бот или прямые сообщения.

<?php

namespace MyApp;

use Ratchet\ConnectionInterface;
use Ratchet\MessageComponentInterface;

class Chat implements MessageComponentInterface
{

    protected $clients;

    public function __construct()
    {
        $localIP = getHostByName(getHostName());
        $this->clients = array();
    }

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients[] = $conn;
    }

    public function onMessage(ConnectionInterface $from, $msg)
    {        
        foreach ($this->clients as $client) {
            if ($client !== $from) {
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn)
    {
        if (($key = array_search($conn, $this->clients)) !== false) {
            unset($this->clients[$key]);
        }
    }

    public function onError(ConnectionInterface $conn, \Exception $e)
    {
        $conn->close();
    }
}

Сторона клиента

Веб-клиент

Я покажу вам только JavaScript для подключения к серверу WebSocket. Вы можете создавать HTML-материал самостоятельно.

var conn = new WebSocket('ws://localhost:8080'); //Change this!
conn.onopen = function (e) {
    $('#send-msg').prop("disabled", false);
};
conn.onmessage = function (e) {
    var msg = JSON.parse(e.data);
    addMessage(msg);
};
$('#send-msg').click(function () {
    var text = $('#msg').val();
    if (text.length === 0) {
        return;
    }
    var msg = {
        'user': user,
        'text': text,
        'time': moment().format('HH:mm')
    };
    conn.send(JSON.stringify(msg));
    addMessage(msg);

    $('#msg').val('');
});

Вот и все. Вам понадобится несколько часов, чтобы создать отличное приложение для чата, но этот код является хорошей отправной точкой.
Если что-то не работает или вам нужна помощь, не стесняйтесь написать комментарий.

public function onError(ConnectionInterface $conn, \Exception $e)
    {
        $conn->close();
    }
}