2015-04-17 45 views
0

我已经设置了一个PHP WebSocket服务器,它能够从客户端读取字符串数据。我的问题是如何处理二进制数据类型。以下是客户端上的代码,将麦克风输入记录为Float32Array对象,并通过二进制WebSocket连接发送数据。编码/取消屏蔽PHP中的Websocket二进制数据

websocket = new WebSocket("ws://..."); 
websocket.binaryType = "arraybuffer"; 

recorder.onaudioprocess = function(stream) { 
    var inputData = stream.inputBuffer.getChannelData(0); 
    websocket.send(inputData); 
} 

至于服务器端,我正在使用以下功能,我已经在网上找到编码/取消屏蔽。

function mask($text) 
{ 
    $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); 
    elseif ($length >= 65536) 
     $header = pack('CCN', $b1, 127, $length); 

    return $header.$text; 
} 

function unmask($payload) 
{ 
    $length = ord($payload[1]) & 127; 

    if($length == 126) { 
     $masks = substr($payload, 4, 4); 
     $data = substr($payload, 8); 
     $len = (ord($payload[2]) << 8) + ord($payload[3]); 
    } 
    elseif($length == 127) { 
     $masks = substr($payload, 10, 4); 
     $data = substr($payload, 14); 
     $len = (ord($payload[2]) << 56) + (ord($payload[3]) << 48) + 
      (ord($payload[4]) << 40) + (ord($payload[5]) << 32) + 
      (ord($payload[6]) << 24) +(ord($payload[7]) << 16) + 
      (ord($payload[8]) << 8) + ord($payload[9]); 
    } 
    else { 
     $masks = substr($payload, 2, 4); 
     $data = substr($payload, 6); 
     $len = $length; 
    } 

    $text = ''; 
    for ($i = 0; $i < $len; ++$i) { 
     $text .= $data[$i]^$masks[$i%4]; 
    } 

    return $text; 
} 

该代码工作得很好,除了他们只处理字符串数据而不是二进制类型。我的问题是如何处理二进制类型并将它们推送给客户端?

回答

0

我真的不明白你想要做什么。 WebRTC可用于创建Peer2Peer连接。因此,您将使用您的PHP服务器作为信号服务器。实际的数据不会传递到您的服务器,除非它需要转发,因为无法建立p2p连接。那是你想要做的吗? 否则,创建一个RtcPeerConnection并按照webrtc的意图发送点对点数据。