GatewayWorker基于Workerman开发,为什么GatewayWorker不支持动态发送二进制数据呢。。。

sky258

都看了论坛的问答,发现GatewayWorker不支持动态发送二进制数据,把项目卡住了
有没有什么解决办法啊

404 2 2
2个回答

walkor

什么叫动态发送二进制数据?

  • sky258 2022-04-27

    根据请求发送

  • sky258 2022-04-27

    根据请求发送二进制或者text

  • walkor 2022-04-27

    你前端通过什么区分服务端发来的数据是二进制?

  • sky258 2022-04-27

    前端来接收文件,数据要二进制的

walkor
class Events
{

    public static function ArrayBufferPack($buffer)
    {
        $len = \strlen($buffer);
        $first_byte = "\x82";
        if ($len <= 125) {
            $encode_buffer = $first_byte . \chr($len) . $buffer;
        } else {
            if ($len <= 65535) {
                $encode_buffer = $first_byte . \chr(126) . \pack("n", $len) . $buffer;
            } else {
                $encode_buffer = $first_byte . \chr(127) . \pack("xxxxN", $len) . $buffer;
            }
        }
        return $encode_buffer;
    }

    public static function onMessage($client_id, $message)
   {
        Gateway::sendToAll(static::ArrayBufferPack(json_encode($new_message)), null, null, true);
   }
}

像上面这样加一个ArrayBufferPack方法,在需要发送websocket二进制数据的时候,
1、用ArrayBufferPack打包数据。
2、send方法的raw参数传true (每个send方法如sendToUid sendToGroup等都有个raw参数)

在不需要发送二进制数据的时候,还是按照之前的方式发送(不能ArrayBufferPack打包,也不要传raw参数)

🔝