2012-05-29 87 views
3

我正在編寫一些基於websockets(RFC 6455)的應用程序。偏偏它看起來像客戶端(在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回調都會運行嗎?
+0

上帝喜歡! :D'CCn'-fix作品完美無缺!多謝,夥計! :) – marverix