2012-05-29 88 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