Расшифровка сетевых символов (HTML5 Websocket) - PullRequest
2 голосов
/ 27 октября 2011

Я пытаюсь разработать веб-чат с веб-сокетом HTML5 (с протоколом hybi-17 ), но у меня есть некоторые проблемы с декодированием символов . Вот что я отправляю через клиента (пользовательский агент: 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 и использует обычные функции сокетов для создания соединения.

Как я могу декодировать эту нечитаемую строку в читаемую человеком?

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 27 октября 2011

Вы сделали одну из самых распространенных ошибок, которые делают люди, когда они впервые начинают писать код, использующий TCP - вы забыли реализовать протокол!

В вашем случае вы забыли это на сервере. У клиента уже есть реализация WebSocket, и вы запрашиваете ее, создавая объект MozWebSocket. В спецификации WebSocket говорится: «Каждый кадр начинается с байта 0x00, заканчивается байтом 0xFF и содержит промежуточные данные UTF-8». Где на сервере код для поиска начала и конца кадра? Где код для сброса байта 0xFF?

Вы на самом деле должны реализовать протокол. Спецификация протокола говорит вам, как декодировать полученные данные. (В вашем случае данные, которые вы видите как нежелательные, скорее всего, являются частью протокольного рукопожатия - части, которая выглядит как ^n:ds[4U в этом описании рукопожатия фазы.)

Я почти уверен, что ваш метод вызова сценария PHP для обработки вызова WebSocket через веб-сервер не будет работать. То есть, если ваш веб-сервер не знает, как это сделать - WaterSpout и phpdaemon do.

0 голосов
/ 06 ноября 2011

Используя базовый server.php и client.html из http://code.google.com/p/phpwebsocket/ вместе с модификацией из HTML5 WebSocket с hybi-17 , чтобы справиться со стандартом с одним ключом, я могу успешно отправить одно сообщение сервер, прежде чем он неожиданно закрывается. Это как минимум на шаг ближе, но пока не ясно, почему он закрывается после одного успешного сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...