Цель состоит в том, чтобы использовать веб-сокет для многопользовательской игры в реальном времени, используя Java для клиентского приложения и PHP для серверной части. Сейчас я сначала разрабатываю серверную часть.
Я попробовал этот код локально, и он работает.
composer.json:
Код: Выделить всё
{
"name": "my/testratchet",
"require": {
"cboden/ratchet": "0.4.4"
}
}
Код: Выделить всё
require_once('MySocketServer.php');
use TestWebSockets\MySocketServer;
require __DIR__ . '/vendor/autoload.php';
$DEFAULT_URL = 'localhost';
$DEFAULT_PORT = 8080;
// Run the server application through the WebSocket protocol on port 8080
$app = new Ratchet\App($DEFAULT_URL, $DEFAULT_PORT);
$app->route('/chat', new MySocketServer(), array('*'));
$app->route('/echo', new Ratchet\Server\EchoServer, array('*'));
$app->run();
Код: Выделить всё
namespace TestWebSockets;
require __DIR__ . '/vendor/autoload.php';
use Exception;
use Ratchet\ConnectionInterface;
use Ratchet\MessageComponentInterface;
class MySocketServer implements MessageComponentInterface
{
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
}
public function onMessage(ConnectionInterface $from, $msg) {
echo "Received data: $msg\n";
foreach ($this->clients as $client) {
if ($from != $client) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}
Код: Выделить всё
var conn = new WebSocket('ws://localhost:8080/echo');
conn.onmessage = function(e) { console.log(e.data); };
conn.onopen = function(e) { conn.send('Hello Me!'); };
- с терминала:
в корневой каталог проектаКод: Выделить всё
cd
Код: Выделить всё
composer install
- Он продолжает работать без каких-либо ошибок
Код: Выделить всё
php startServer.php
- откройте консоль с помощью F12
- перейдите на вкладку «Сеть»
- в типе URL-адреса http://localhost/projectDir/testClientWeb.php
- в консоли появляется строка сети: нажмите на нее и перейдите на внутреннюю вкладку Response . Вы увидите:
(зеленая стрелка: отправлено)Код: Выделить всё
↑ Hello Me!
- (красная стрелка: получено)
Код: Выделить всё
↓ Hello Me!
Теперь, прежде чем развернуть его в цифровом океане, я заменил «localhost» на «my-generated-project-url.ondigitalocean.app» и «ws» на «wss», потому что это необходимо. DigitalOcean, в App Platform есть только один открытый порт — 8080, и SSL обязателен, поэтому мне нужно использовать wss для подключения к сокету сервера.
Затем в цифровом океане я создал приложение на платформе приложений со следующими настройками:
- источник: мой репозиторий
- только один компонент как «Веб-сервис»
- Каталог исходного кода : /
- автоматическое развертывание: включено
- 0 переменных среды
- только один маршрут: /
- Проверка работоспособности: TCP
- Команда сборки: нет
- Команда запуска: Heroku-php-apache2 && php startServer.php
Порт HTTP: 8080
Код: Выделить всё
Detected
Detected 512MiB of RAM
PHP memory_limit is 128M Bytes
Starting php-fpm with 4 workers...
Starting httpd...
Application ready for connections on port 8080.
Код: Выделить всё
"GET /testClientWeb.php HTTP/1.1" 200 295 "-" "Mozilla...

Я попробовал пример (с узлом js), показанный в этом официальном опубликуйте сообщение, и оно работает: https://docs.digitalocean.com/developer ... -platform/, но мне нужно использовать PHP в качестве бэкэнда.
Как заставить его работать с PHP?
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/772 ... p-platform