2013-01-25 4 views
1

Я пытаюсь кодировать данные, которые я буду отправлять в браузер, используя websockets. Я основываюсь на this tutorial:Данные для кодирования данных в сети, которые должны быть отправлены

private function encode($text) { 
    // 0x1 text frame (FIN + opcode) 
    $b1 = 0x80 | (0x1 & 0x0f); 
    $length = strlen($text); 

    if($length > 125 && $length < 65536) 
     $header = pack('CCS', $b1, 126, $length); 
    elseif($length >= 65536) 
     $header = pack('CCN', $b1, 127, $length); 

    return $header.$text; 
} 

Может кто-нибудь сказать мне, что случилось с этой функцией, потому что я не получаю никаких данных в веб-браузере.
Я использую его на этой линии:

$msg = $this->encode($msg); 

    parent::send($client,$msg); 

PS: Я не очень хорошо с бинарными действиями.

+0

Полный полный код [здесь] (http://dharman.eu/?menu=phpWebSocketsTutorial) – Dharman

ответ

1

@Dharman, я использовал тот же код изначально для кодирования данных в моем WebSocket сценарий, и он не будет работать в некоторых случаях даже с поправками. Проблема заключается в том, что длина полезной нагрузки (данных) вычисляется неправильно. Другими словами, вы не можете просто использовать функцию strlen.

Пожалуйста, смотрите мою соответствующую должность подробную информацию о том, как исправить это: What is this data at the end of WebRTC candidate info?

+0

Я не understant, как вы получите длина сообщения? Каков символ в позиции 1, рассказывающий вам о длине, если сообщение является простой строкой? – Dharman

+0

Символ в позиции 1 (то есть второй байт сообщения) представляет собой комбинацию одного бита, обозначающего, замаскировано ли сообщение (то есть закодировано) и семь битов, обозначающих длину полезной нагрузки (то есть данных). Первый бит всегда должен быть 1 согласно спецификации, потому что сообщение всегда должно быть замаскировано. Следующие семь бит, когда они преобразуются в десятичное число, дают вам длину. Однако, поскольку вы можете перейти только до 127 с семью битами, должен быть способ получить длину сообщений, которые больше, чем это. Согласно спецификациям, если сообщение длиннее 125 символов ... – HartleySan

+0

Затем семь бит, обозначающих длину полезной нагрузки, должны быть 126, а фактическая длина затем сохраняется в 3-м и 4-м байтах в сообщении. Если сообщение длиннее 65535 символов, то семь битов, обозначающих длину полезной нагрузки, должны быть 127, а фактическая длина хранится в 3-м-8-м байтах. Чтобы преобразовать двоичные биты, составляющие байты в десятичную для длины, вы должны использовать побитовые операторы, как я сделал в решении, связанном выше ... – HartleySan

1

Я решил. Утверждения if были неправильными. Вот как они должны выглядеть следующим образом:

if($length <= 125) 
     $header = pack('CC', $b1, $length); 
    elseif($length > 125 && $length < 65536) 
     $header = pack('CCS', $b1, 126, $length); 
    elseif($length >= 65536) 
     $header = pack('CCN', $b1, 127, $length); 
Смежные вопросы