我正在尝试使用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 :(得分: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);
答案 1 :(得分:1)
@Dharman,我最初使用相同的代码来编码我的WebSocket脚本中的数据,并且在某些情况下即使进行了更正也无法使用。 问题是没有正确计算有效载荷(数据)的长度。换句话说,你不能只使用strlen函数。
有关如何解决此问题的详细信息,请参阅我的相关帖子:What is this data at the end of WebRTC candidate info?
答案 2 :(得分:1)
Dharman更正了if语句对于超过125个字符的字符串失败的问题。正确的if语句为:
if($length <= 125) {
$header = pack('CC', $b1, $length);
} elseif ($length > 125 && $length < 65536) {
$header = pack('CSC', $b1, 126, $length);
} elseif ($length >= 65536) {
$header = pack('CNC', $b1, 127, $length);
}