Подключение к храповому серверу веб-сокетов с использованием PHP

Я запускаю Ratchet WebSocketServer в своем бэкэнде, все работает нормально.

<?php

require '../vendor/autoload.php';

use Ratchet\WebSocket\WsServer;
use Ratchet\Http\HttpServer;

$wsServer = new WsServer(new Chat());
$wsServer->disableVersion(0);

$server = \Ratchet\Server\IoServer::factory(
    new HttpServer(
        $wsServer
    ),
    8080
);

$server->run();

Но я хочу подключиться к веб-сокету, используя простой php-скрипт, чтобы отправить сообщение на сервер.

$host = 'ws://localhost';  //where is the websocket server
$port = 8080;
$local = "http://example.com";  //url where this script run 
$data = "first message";  //data to be send

$head = "GET / HTTP/1.1"."\r\n".
    "Upgrade: WebSocket"."\r\n".
    "Connection: Upgrade"."\r\n".
    "Origin: $local"."\r\n".
    "Host: $host:$port"."\r\n".
    "Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n".
    "Content-Length: ".strlen($data)."\r\n"."\r\n";

//WebSocket handshake
$sock = fsockopen($host, $port);
fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);
$headers = fread($sock, 2000);

echo $headers;

fwrite($sock, $data) or die('error:'.$errno.':'.$errstr);
$wsdata = fread($sock, 2000);
fclose($sock);

Но ошибка, которую я получаю.

error:32744:Unable to find the socket transport "ws" - did you forget   to enable it when you configured PHP?

Затем, когда я меняю хост и не использую ws://, он говорит.

error:111:Connection refused

Кто-нибудь знает, как отправлять данные на работающий сервер Ratchet WebSocket из простого php-файла?


person DB93    schedule 20.07.2016    source источник


Ответы (1)


Я пробовал этот проект вместе с Ratchet, и он отлично работает как PHP-клиент:

https://github.com/Textalk/websocket-php

Установить с помощью: composer require textalk/websocket 1.0.*

И пример использования:

<?php

require('vendor/autoload.php');

use WebSocket\Client;

$client = new Client("ws://127.0.0.1:1234");
$client->send("Hello from PHP");

echo $client->receive() . "\n"; // Should output 'Hello from PHP'

Я тестировал, и это также работает с SSL, если вы используете wss:// (для удаленных веб-сокетов).

person RaisinBranCrunch    schedule 25.03.2017
comment
@Raisin.можем ли мы отправить массив байтов с помощью этой библиотеки через веб-сокет в php - person Vision Coderz; 30.03.2017
comment
Библиотека ожидает, что функции send() будет передана строка. Если у вас есть сервер на PHP (например, Ratchet), вы можете просто сериализовать массив байтов на клиенте, а сервер не сериализовать его. Если не все сообщения, полученные на Ratchet, будут массивами байтов, вы можете добавить к этим сообщениям префикс, например byte_array:a:44:{i:1;i:84; ...так далее. - person RaisinBranCrunch; 30.03.2017
comment
да, если я seialize, то его отправка в виде строки, но для меня получающая сторона - это только массив байтов, поэтому я не могу сериализовать. - person Vision Coderz; 31.03.2017