Cоздания чата в реальном времени с использованием WebSockets
Структура проекта:server.php — WebSocket-сервер на PHP.index.html — Интерфейс чата.chat.js — Логика клиента для соединения с WebSocket-сервером.1. Файл server.php (WebSocket-сервер на PHP)
Для работы WebSocket на PHP, нужно использовать библиотеку Ratchet. Установите её через Composer:
composer require cboden/ratchet
Теперь создадим WebSocket-сервер:
<?php require __DIR__ . '/vendor/autoload.php'; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { // Новое соединение открыто $this->clients->attach($conn); echo "Новое соединение ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { // Сообщение получено, отправляем всем клиентам foreach ($this->clients as $client) { if ($from !== $client) { $client->send($msg); } } } public function onClose(ConnectionInterface $conn) { // Соединение закрыто $this->clients->detach($conn); echo "Соединение {$conn->resourceId} закрыто\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "Ошибка: {$e->getMessage()}\n"; $conn->close(); } } // Запуск WebSocket-сервера $server = \Ratchet\App::factory('localhost', 8080, '0.0.0.0'); $server->route('/chat', new Chat, ['*']); $server->run();
2. Файл index.html (интерфейс чата)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Чат в реальном времени</title> <style> #chat { height: 300px; width: 100%; border: 1px solid #000; overflow-y: scroll; margin-bottom: 10px; } #message { width: 80%; } </style> </head> <body> <div id="chat"></div> <input type="text" id="message" placeholder="Введите сообщение..."> <button id="send">Отправить</button> <script src="chat.js"></script> </body> </html>
3. Файл chat.js (клиентская логика)
document.addEventListener('DOMContentLoaded', function () { var chat = document.getElementById('chat'); var message = document.getElementById('message'); var send = document.getElementById('send'); // Соединение с WebSocket-сервером var conn = new WebSocket('ws://localhost:8080/chat'); // Получение сообщений с сервера conn.onmessage = function (e) { var newMessage = document.createElement('div'); newMessage.textContent = e.data; chat.appendChild(newMessage); chat.scrollTop = chat.scrollHeight; // Автопрокрутка }; // Отправка сообщений send.addEventListener('click', function () { if (message.value !== '') { conn.send(message.value); message.value = ''; // Очищаем поле ввода } }); // Нажатие клавиши Enter для отправки message.addEventListener('keypress', function (e) { send.click(); } }); });
Как это работает:server.php — это WebSocket-сервер, который обрабатывает события открытия соединения, получения сообщений и закрытия соединения. Когда клиент отправляет сообщение, сервер пересылает его всем подключенным клиентам, кроме того, кто отправил.index.html — простой интерфейс чата с полем для сообщений и кнопкой "Отправить". Также есть блок, куда будут добавляться новые сообщения.chat.js — клиентская логика. После загрузки страницы устанавливается WebSocket-соединение с сервером. Когда сервер отправляет сообщение, оно добавляется в чат. Пользователь может отправлять сообщения как кликом по кнопке "Отправить", так и нажатием клавиши Enter.Как запустить:Установите Ratchet через Composer:composer require cboden/ratchetЗапустите WebSocket-сервер:php server.phpОткройте файл index.html в браузере и начните обмениваться сообщениями.Примечание:Чтобы эта система заработала на удаленном сервере или локально с других устройств, убедитесь, что порты открыты, и замените localhost в WebSocket URL на ваш IP-адрес или домен.Этот пример показывает, как можно использовать WebSockets для создания реального чата, где все пользователи могут общаться в реальном времени без перезагрузки страницы или дополнительных запросов к серверу.