Exemple #1
0
 /**
  * 有消息时触发该方法
  * @param int $client_id 发消息的client_id
  * @param string $message 消息
  * @return void
  */
 public static function onMessage($client_id, $message)
 {
     $message = substr($message, 4);
     //解析传输的数据
     $cmd = new PbCmd();
     try {
         $cmd->parseFromString($message);
     } catch (Exception $ex) {
         return $ex->getMessage();
     }
     //接收参数
     $obj = $cmd->getObj();
     $method = $cmd->getMethod();
     $params = $cmd->getParams();
     //统计数据
     $class = substr($obj, 8);
     StatisticClient::tick($class, $method);
     try {
         //处理业务逻辑
         $instance = new $obj();
         $buffer = $instance->{$method}($params);
         StatisticClient::report($class, $method, 1, 0, 'successful');
     } catch (Exception $ex) {
         $pbResult = new PbResult();
         $pbResult->setCode($ex->getCode());
         $pbResult->setMsg($ex->getMessage());
         $buffer = $pbResult->SerializeToString();
         $total_length = 4 + strlen($buffer);
         $buffer = pack('N', $total_length) . $buffer;
         StatisticClient::report($class, $method, 0, $ex->getCode(), $ex->getMessage());
     }
     echo 'Login_Woker' . PHP_EOL;
     return Gateway::sendToCurrentClient($buffer);
 }
Exemple #2
0
 /**
  * 有消息时触发该方法
  * @param int $client_id 发消息的client_id
  * @param string $message 消息
  * @return void
  */
 public static function onMessage($client_id, $message)
 {
     $message_data = TextProtocol::decode($message);
     // **************如果没有$_SESSION['name']说明没有设置过用户名,进入设置用户名逻辑************
     if (empty($_SESSION['name'])) {
         $_SESSION['name'] = TextProtocol::decode($message);
         Gateway::sendToCurrentClient("chat room login success, your client_id is {$client_id}, name is {$_SESSION['name']}\r\nuse client_id:words send message to one user\r\nuse words send message to all\r\n");
         // 广播所有用户,xxx come
         return GateWay::sendToAll(TextProtocol::encode("{$_SESSION['name']}[{$client_id}] come"));
     }
     // ********* 进入聊天逻辑 ****************
     // 判断是否是私聊
     $explode_array = explode(':', $message, 2);
     // 私聊数据格式 client_id:xxxxx
     if (count($explode_array) > 1) {
         $to_client_id = (int) $explode_array[0];
         GateWay::sendToClient($client_id, TextProtocol::encode($_SESSION['name'] . "[{$client_id}] said said to [{$to_client_id}] :" . $explode_array[1]));
         return GateWay::sendToClient($to_client_id, TextProtocol::encode($_SESSION['name'] . "[{$client_id}] said to You :" . $explode_array[1]));
     }
     // 群聊
     return GateWay::sendToAll(TextProtocol::encode($_SESSION['name'] . "[{$client_id}] said :" . $message));
 }
Exemple #3
0
 /**
  * websocket协议握手
  * @param string $message
  */
 public static function checkHandshake($message)
 {
     // WebSocket 握手阶段
     if (0 === strpos($message, 'GET')) {
         // 解析Sec-WebSocket-Key
         $Sec_WebSocket_Key = '';
         if (preg_match("/Sec-WebSocket-Key: *(.*?)\r\n/", $message, $match)) {
             $Sec_WebSocket_Key = $match[1];
         }
         $new_key = base64_encode(sha1($Sec_WebSocket_Key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
         // 握手返回的数据
         $new_message = "HTTP/1.1 101 Switching Protocols\r\n";
         $new_message .= "Upgrade: websocket\r\n";
         $new_message .= "Sec-WebSocket-Version: 13\r\n";
         $new_message .= "Connection: Upgrade\r\n";
         $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";
         // 发送数据包到客户端 完成握手
         Gateway::sendToCurrentClient($new_message);
         return true;
     } elseif (trim($message) === '<policy-file-request/>') {
         $policy_xml = '<?xml version="1.0"?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>' . "";
         Gateway::sendToCurrentClient($policy_xml);
         return true;
     }
     return false;
 }