/** * 有消息时触发该方法 * @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); }
/** * 有消息时触发该方法 * @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)); }
/** * 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; }