public function testEncode()
 {
     $message = RPCMessage::createWithRpc('a.a', ['b' => 123], 2);
     $encodeMessage = $message->encode();
     self::assertNotEmpty($encodeMessage);
     $decodeMessages = RPCMessage::decode($encodeMessage);
     self::assertNotEmpty($decodeMessages);
     self::assertEquals(count($decodeMessages), 1);
     /**
      * @var $decodeMessage RPCMessage
      */
     $decodeMessage = end($decodeMessages);
     self::assertTrue($decodeMessage instanceof RPCMessage);
     self::assertEquals('a.a', $decodeMessage->getFunctionName());
     self::assertEquals(['b' => 123], $decodeMessage->getFunctionParams());
 }
 public function testEncodeOrDecode()
 {
     $messages = [];
     $messages[] = RPCMessage::createWithRpc('a.a', ['b' => 1]);
     $messages[] = RPCMessage::createWithRpc('b.b', ['c' => 1]);
     $messageString = RPCMessageEncode::encodeMessages($messages);
     $this->assertNotEmpty($messageString);
     $decodeMessages = RPCMessageEncode::decodeMessages($messageString);
     $this->assertTrue(is_array($decodeMessages));
     $this->assertCount(2, $decodeMessages);
     foreach ($decodeMessages as $decodeMessage) {
         $this->assertInstanceOf(RPCMessage::class, $decodeMessage);
     }
     $decodeMessage = $decodeMessages[0];
     if ($decodeMessage instanceof RPCMessage) {
         $this->assertEquals('a.a', $decodeMessage->getMessageBodyProperty(RPCMessage::Msg_RPC_FunctionName));
         $this->assertEquals(['b' => 1], $decodeMessage->getMessageBodyProperty(RPCMessage::Msg_PPC_FunctionParams));
     }
     $decodeMessage = $decodeMessages[1];
     if ($decodeMessage instanceof RPCMessage) {
         $this->assertEquals('b.b', $decodeMessage->getMessageBodyProperty(RPCMessage::Msg_RPC_FunctionName));
         $this->assertEquals(['c' => 1], $decodeMessage->getMessageBodyProperty(RPCMessage::Msg_PPC_FunctionParams));
     }
 }
 /**
  * 解密网络消息
  * @param $message_str
  * @param bool|true $alloc
  * @param bool $encrypt
  * true 返回 RPCMessage 实例数组 ,
  * false 返回数组
  * @return mixed|null
  */
 static function decodeMessages($message_str, $alloc = true, $encrypt = false)
 {
     try {
         // 解压缩数据
         $unBase64 = base64_decode($message_str);
         if ($unBase64 === FALSE) {
             return null;
         }
         if ($encrypt) {
             // 解密
             for ($i = strlen($unBase64) - 1; $i >= self::NOT_OR_KEY_LEN; $i--) {
                 $unBase64[$i] = $unBase64[$i - self::NOT_OR_KEY_LEN] ^ $unBase64[$i];
             }
             $unBase64 = substr($unBase64, self::NOT_OR_KEY_LEN);
         }
         $messagesData = gzuncompress($unBase64);
         if ($messagesData === FALSE) {
             return null;
         }
         $jsonDecodeMessages = json_decode($messagesData, true);
         $messages = [];
         if ($alloc) {
             foreach ($jsonDecodeMessages as $key => $jsonDecodeMessage) {
                 $messages[$key] = RPCMessage::createWithArray($jsonDecodeMessage);
             }
         } else {
             $messages = $jsonDecodeMessages;
         }
     } catch (\Exception $e) {
         return null;
     }
     return $messages;
 }