Я пишу какое-то приложение на основе websockets (RFC 6455). К сожалению, похоже, что клиент (тестирование на Chrome 18) не получает данные, но сервер говорит, что он отправляет …
Chrome ничего не говорит
Вот основные методы сервера:
private function decode($payload) { $length = ord($payload[1]) & 127; if ($length == 126) { $masks = substr($payload, 4, 4); $data = substr($payload, 8); } elseif ($length == 127) { $masks = substr($payload, 10, 4); $data = substr($payload, 14); } else { $masks = substr($payload, 2, 4); $data = substr($payload, 6); } $text = ''; for ($i = 0; $i < strlen($data); ++$i) { $text .= $data[$i] ^ $masks[$i % 4]; } $text = base64_decode($text); return $text; } private function encode($text) { $text = base64_encode($text); // 0x1 text frame (FIN + opcode) $b1 = 0x80 | (0x1 & 0x0f); $length = strlen($text); if ($length <= 125) $header = pack('CC', $b1, $length); elseif ($length > 125 && $length < 65536) $header = pack('CCS', $b1, 126, $length); else $header = pack('CCN', $b1, 127, $length); return $header . $text; } protected function process($user, $msg) { echo '<< '.$msg.N; if (empty($msg)) { $this->send($user->socket, $msg); return; } } protected function send($client, $msg) { $msg = $this->encode($msg); echo '>> '.$msg.N; socket_write($client, $msg, strlen($msg)); }
Если вы отправляете тестовое сообщение> 125 байт, но <65536, ваша проблема может быть вызвана неправильной строкой формата для упаковки. Я думаю, что это должно быть «CCn» (ваш текущий код записывает 2 байта длины в неправильном порядке).
Если это не поможет, вы можете попробовать выполнить несколько операций на стороне клиента: