Я пытаюсь разработать webchat с websocket HTML5 (с протоколом hybi-17 ), но у меня есть некоторые проблемы с расшифровкой символов . Это то, что я посылаю через клиента (user-agent: Firefox 7):
var socket = new MozWebSocket ('ws://localhost/server.php'); socket.onopen = function () { alert ('Opened!'); }
Затем я отправляю эти данные:
socket.send ('Hello'); socket.send ('World');
И это код на стороне сервера:
$bytes = @socket_recv ($socket, $buffer, BUFSIZE, 0); if (($bytes == 0) || ($bytes == 2)) { this->disconnect ($socket); } else { echo $buffer; }
Хотя это данные, полученные эхом:
6S~g?Y (Hello) ~ (World)
Как вы можете видеть, сокет открывается и данные перемещаются от клиента к серверу. Сервер работает с PHP5 и использует обычные функции сокетов для построения соединения.
Как я могу декодировать эту нечитаемую строку в удобочитаемом человеке?
Заранее спасибо.
Вы сделали одну из самых распространенных ошибок, возникающих у людей, когда они впервые начали писать код, который использует TCP – вы забыли реализовать протокол!
В вашем случае вы забыли его на сервере. У клиента уже есть реализация WebSocket, и вы запрашиваете его, создавая объект «MozWebSocket». Спецификация WebSocket гласит: «Каждый кадр начинается с 0x00 байт, заканчивается байтом 0xFF и содержит данные UTF-8 между ними». Где код на сервере, чтобы найти начало кадра и конец кадра? Где код для отбрасывания байта 0xFF?
Фактически вам нужно реализовать протокол. Спецификация протокола сообщает вам, как декодировать полученные данные. (В вашем случае данные, которые вы видите как нежелательные, скорее всего являются частью рукопожатия протокола – это часть, которая выглядит как ^n:ds[4U
в этом описании фазы handkshake .)
Я почти уверен, что ваш метод вызова PHP-скрипта для обработки вызова WebSocket через веб-сервер не будет работать. То есть, если ваш веб-сервер не знает, как это сделать – WaterSpout и phpdaemon .
Используя базовый сервер.php и client.html из http://code.google.com/p/phpwebsocket/, а также с помощью модификации из HTML5 WebSocket с помощью hybi-17 для работы с одним ключевым стандартом, я могу успешно отправить одно сообщение на перед тем, как он неожиданно завершится. Это, по крайней мере, еще один шаг, который еще не уверен, но почему он закрывается после одного успешного сообщения.