Используя указания на сайте socketo.me, я пытаюсь заставить веб-сокеты работать с помощью Ratchet для php. . В соответствии с инструкциями мне потребовалась Ratchet версии 0.2.* в моем файле composer.json. Я использую php 5.4.9-4ubuntu2 и Apache 2. Для браузеров я использую Firefox 21.0 и Chrome 26.0.1410.63. На на этом сайте говорится, что Rachet поддерживает Firefox 6–20 и Chrome 13–26, но при использовании Firefox результаты почти идентичны. 21, как в Chrome 26.
Вот мой класс, реализующий MessageComponentInterface.
<?php
namespace WebsocketTest;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
require dirname (__DIR__).'/../../../../vendor/autoload.php';
class Chat implements MessageComponentInterface
{
protected $clients;
public function __construct ()
{
$this->clients = new \SplObjectStorage;
}
public function onOpen (ConnectionInterface $conn)
{
// Store the new connection to send messages to later
$this->clients->attach ($conn);
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage (ConnectionInterface $from, $msg)
{
$numRecv = count ($this->clients) - 1;
echo sprintf ('Connection %d sending message "%s" to %d other connection%s'."\n", $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
foreach ($this->clients as $client)
{
if ($from !== $client)
{
// The sender is not the receiver, send to each client connected
$client->send ($msg);
}
}
}
public function onClose (ConnectionInterface $conn)
{
// The connection is closed, remove it, as we can no longer send it messages
$this->clients->detach ($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError (ConnectionInterface $conn, \Exception $e)
{
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close ();
}
}
Вот мой код сценария оболочки.
<?php
use Ratchet\Server\IoServer;
use WebsocketTest\Chat as Chat;
require_once __DIR__.'/Chat.php';
$server = IoServer::factory (new Chat (), 8080);
$server->run ();
Вот вывод, который я получаю из сценария оболочки.
New connection! (38)
Connection 38 sending message "GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: www.zf2.dev:8080
Origin: http://www.zf2.dev
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: YHbsxEgVhWTDJjaBJAGHdQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
" to 1 other connection
New connection! (39)
Connection 39 sending message "GET / HTTP/1.1
Host: www.zf2.dev:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: http://www.zf2.dev
Sec-WebSocket-Key: EPpLFS3bXx/eC+WaoNDacA==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
" to 2 other connections
Connection 37 has disconnected
Connection 38 has disconnected
Вот мой код javascript. После создания соединения я вывожу его в консоль javascript.
var conn = null;
function test_websockets ()
{
conn = new WebSocket ('ws://www.zf2.dev:8080');
console.log (conn);
conn.onopen = function (e) { console.log ("Connection established!"); };
conn.onmessage = function (e) { console.log (e.data); };
conn.onclose = function (e) { console.log ('closed') };
// conn.send ('sending message from the client');
}
function test_ws_message ()
{
conn.send ('the test message');
}
Это вывод, который я получаю в своей консоли javascript в Chrome.
WebSocket {binaryType: "blob", extensions: "", protocol: "", onclose: null, onerror: null…}
html5test.js:34
Uncaught Error: InvalidStateError: DOM Exception 11 html5test.js:47
test_ws_message html5test.js:47
onclick
И это вывод, который я получаю от Firebug в Firefox.
WebSocket { url="ws://www.zf2.dev:8080", readyState=0, bufferedAmount=0, more...}
html5test.js (line 34)
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
[Break On This Error]
conn.send ('the test message');
html5test.js (line 47)
closed
html5test.js (line 38)
Firefox can't establish a connection to the server at ws://www.zf2.dev:8080/.
conn = new WebSocket ('ws://www.zf2.dev:8080');
Обратите внимание, что Firefox показывает, что соединение немедленно закрыто, а Chrome — нет. Однако Chrome никогда не показывает, что соединение открыто, поэтому я не думаю, что оно работает ни в одном из браузеров. Похоже, серверный скрипт считает, что соединения были установлены, но ни один из браузеров никогда не показывает мне "Соединение установлено!" сообщение, указывающее, что был вызван метод onopen. Мне удалось найти один комментарий, в котором говорилось, что несовместимые версии «рукопожатия» веб-сокетов могут вызвать это, но я так и не нашел никакой информации о другой версии Ratchet или о том, что мне нужно сделать, чтобы запустить совместимую версию на клиенте и сервер. Я также нашел некоторые комментарии, в которых говорилось, что иногда onopen вообще не вызывается, во что мне трудно поверить. Любые идеи о том, в чем может быть проблема или как ее исправить, будут очень признательны.
conn.send ('sending message from the client');
в javascript на стороне клиента, я получаю следующие сообщения из консоли javascript Chrome: WebSocket {binaryType: blob, extensions:, protocol:, onclose: null, onerror: null…} Uncaught Error: InvalidStateError: Исключение DOM 11 закрыто - person user2455811   schedule 05.06.2013