作为一个[PHP]websocket服务器,我如何在关闭框架上设置状态代码



关闭控制框看起来像

type:"close"
[payload:""]

所以我们不必发送状态代码和/或(字符串(原因。但如果我们想——怎么做?

我从https://www.rfc-editor.org/rfc/rfc6455#section-5.5.1代码和原因属于";应用程序数据";其被附加到有效载荷。因此,在这种情况下,有效载荷是应用程序数据。到目前为止还不错。

然后它说:

如果有正文正文必须是2字节无符号整数(按网络字节顺序(表示具有第7.4节中定义的值/code/的状态代码。在2字节整数之后,正文可能包含UTF-8编码的数据具有价值/理由/,其解释不由本规范。区块报价

前两个字节-2字节无符号整数-OK,例如1001

正文可能包含带有值/原因/--OK的UTF-8编码数据

但是哪种格式呢?

 type: close
 payload: 1001shutdown

哦?

我怀疑没有格式。有人知道怎么做吗?

=========

编辑

感谢盖迪蓬克!这里有一些代码,以防有人想使用:

public function encodeClosePayload($code, $reason='')
{
    $code = $this->closeCodeDecToBytes($code);
    return $code . $reason;
}
public function decodeClosePayload($payload)
{
    $code = $this->closeCodeBytesToDec(substr($payload, 0, 2));
    $reason = (strlen($payload) > 2) ? substr($payload, 2) : '';
    return array($code, $reason);
}
protected function closeCodeBytesToDec($bytes)
{
    return hexdec( dechex( ord($bytes[0]) ) . dechex( ord($bytes[1]) ) );
}
protected function closeCodeDecToBytes($dec)
{
    $hex = dechex($dec);
    $second = substr($hex, -2);
    $first = sprintf('%02s', substr($hex, 0, strlen($hex)-strlen($second)));
    return chr('0x' . $first) . chr('0x' . $second);
}

建议欢迎

$payload = "X03Xe9Shutdown";

您需要在数字上下文中设置状态,而不是在字符串上下文中。

将二进制数据注入字符串的最简单方法是将其添加为转义的十六进制数。

我的计算器告诉我hex 03e9==dec 1001,但你可以自己确认:3*256+14*16+9=1001。

如果你保持原样,你的前两个字节将是ascii字符"10",在数字上下文中是12592。(49*256+48(

$ php -a
php > $test ="X03Xe9Shutdown";
php > var_dump($test);
string(10) "?Shutdown"
php > var_dump(ord($test[0]));
int(3)
php > var_dump(ord($test[1]));
int(233)

如果您发现字符串中的转义十六进制很难看,也可以使用PHP pack()函数来完成:

$ php -a
php > $test = pack('n*', 1001) . 'Shutdown';
php > var_dump($test);
string(10) "?Shutdown"
php > var_dump(ord($test[0]));
int(3)
php > var_dump(ord($test[1]));
int(233)

相关内容

  • 没有找到相关文章

最新更新