Example #1
0
 /**
  * client包格式: writeString(json_encode(array("a"='main/main',"m"=>'main', 'k1'=>'v1')));
  * server包格式:包总长+数据(json_encode)
  * @param $_data
  * @return bool
  */
 public function parse($_data)
 {
     $ctrlName = Config::getField('project', 'default_ctrl_name', 'main\\main');
     $methodName = Config::getField('project', 'default_method_name', 'main');
     $fd = Request::getFd();
     if (!empty($this->_buffer[$fd])) {
         $_data = $this->_buffer . $_data;
     }
     $packData = new MessagePacker($_data);
     $packLen = $packData->readInt();
     $dataLen = \strlen($_data);
     if ($packLen > $dataLen) {
         $this->_buffer[$fd] = $_data;
         return false;
     } elseif ($packLen < $dataLen) {
         $this->_buffer[$fd] = \substr($_data, $packLen, $dataLen - $packLen);
     } else {
         if (!empty($this->_buffer[$fd])) {
             unset($this->_buffer[$fd]);
         }
     }
     $packData->resetOffset();
     $params = $packData->readString();
     $data = \json_decode($params, true);
     $apn = Config::getField('project', 'ctrl_name', 'a');
     $mpn = Config::getField('project', 'method_name', 'm');
     if (isset($params[$apn])) {
         $ctrlName = \str_replace('/', '\\', $params[$apn]);
     }
     if (isset($params[$mpn])) {
         $methodName = $params[$mpn];
     }
     Request::init($ctrlName, $methodName, $data, Config::getField('project', 'view_mode', 'Zpack'));
     return true;
 }
Example #2
0
 public function msg($toId, $msg)
 {
     $fd = Request::getFd();
     $uid = $this->getConn()->getUid($fd);
     if (empty($toId)) {
         //公共聊天
         $this->sendToChannel(common\Cmd::CHAT, array($uid, $msg, $toId));
     } else {
         //私聊
         $toInfo = $this->getConn()->get($toId);
         if (!empty($toInfo)) {
             $this->sendOne($toInfo['fd'], common\Cmd::CHAT, array($uid, $msg, $toId));
             $this->sendOne($fd, common\Cmd::CHAT, array($uid, $msg, $toId));
         }
     }
 }
Example #3
0
 /**
  * 包格式: 包总长+命令id+请求id+数据
  * 
  * @param $_data
  * @return bool
  */
 public function parse($_data)
 {
     $ctrlName = Config::getField('project', 'default_ctrl_name', 'main\\main');
     $methodName = Config::getField('project', 'default_method_name', 'main');
     if (empty($this->_cache)) {
         $this->_cache = ZCache::getInstance('Php');
     }
     $fd = Request::getFd();
     $cacheData = $this->_cache->get($fd);
     if (!empty($cacheData)) {
         $_data = $cacheData . $_data;
         $this->_cache->delete($fd);
     }
     if (empty($_data)) {
         return false;
     }
     $packData = new MessagePacker($_data);
     $packLen = $packData->readInt();
     $dataLen = \strlen($_data);
     if ($packLen > $dataLen) {
         $this->_cache->set($fd, $_data);
         return false;
     } elseif ($packLen < $dataLen) {
         $this->_cache->set($fd, \substr($_data, $packLen, $dataLen - $packLen));
     }
     $packData->resetOffset(4);
     $data = [];
     $data['_cmd'] = $packData->readInt();
     $pathinfo = Config::getField('cmdlist', $data['_cmd']);
     $data['_rid'] = $packData->readInt();
     $params = $packData->readString();
     $unpackData = \json_decode(gzdecode($params), true);
     if (!empty($unpackData) && \is_array($unpackData)) {
         $data += $unpackData;
     }
     $routeMap = ZRoute::match(Config::get('route', false), $pathinfo);
     if (is_array($routeMap)) {
         $ctrlName = $routeMap[0];
         $methodName = $routeMap[1];
         if (!empty($routeMap[2]) && is_array($routeMap[2])) {
             //参数优先
             $data = $data + $routeMap[2];
         }
     }
     Request::init($ctrlName, $methodName, $data);
     return true;
 }