Websocket - 客户端不接收数据


Websocket - client doesn't receive data

我正在编写一些基于websockets的应用程序(RFC 6455)。不幸的是,看起来客户端(在Chrome 18上测试)没有收到数据,但服务器说它正在发送...

铬什么也没说

以下是主要的服务器方法:

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 个字节)。

如果这没有帮助,您可以尝试一些客户端日志记录:

  • onopen 回调是否运行以证明初始握手已成功完成?
  • onerror 或 onclose 回调是在连接后还是在服务器发送消息后运行?