2012-05-29 6 views
3

Я пишу какое-то приложение на основе websockets (RFC 6455). Unfortunetly это похоже на клиенте (тестирование на Chrome 18) не получают данные, но сервер говорит, что посылает ...Websocket - клиент не получает данные

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)); 
} 

ответ

1

Если вы отправляете тестовое сообщение> 125 байт, но < 65536, ваша проблема может быть вызвана неправильной строкой формата для упаковки. Я думаю, что это должно быть «CCn» (ваш текущий код записывает 2 байта длины в неправильном порядке).

Если это не помогает, вы можете попробовать на стороне клиента, ведение журнала:

  • ли OnOpen запуска обратного вызова, чтобы доказать, что первоначальный handshake успешно завершена?
  • Выполняется ли onerror или onclose callbacks после подключения или после отправки сервером своего сообщения?
+0

БОГ НРАВИТСЯ! : D 'CCn'-fix работает просто отлично! Спасибо приятель! :) – marverix

Смежные вопросы