/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $message) { // 如果是websocket握手 if (self::checkHandshake($message)) { $new_message = '{"type":"welcome","id":' . $client_id . '}'; // 发送数据包到客户端 return GateWay::sendToCurrentClient(WebSocket::encode($new_message)); return; } // websocket 通知连接即将关闭 if (WebSocket::isClosePacket($message)) { Gateway::kickClient($client_id, ''); self::onClose($client_id); return; } // 获取客户端原始请求 $message = WebSocket::decode($message); $message_data = json_decode($message, true); if (!$message_data) { return; } switch ($message_data['type']) { // 更新用户 case 'update': // 转播给所有用户 Gateway::sendToAll(WebSocket::encode(json_encode(array('type' => 'update', 'id' => $client_id, 'angle' => $message_data["angle"] + 0, 'momentum' => $message_data["momentum"] + 0, 'x' => $message_data["x"] + 0, 'y' => $message_data["y"] + 0, 'life' => 1, 'name' => isset($message_data['name']) ? $message_data['name'] : 'Guest.' . $client_id, 'authorized' => false)))); return; // 聊天 // 聊天 case 'message': // 向大家说 $new_message = array('type' => 'message', 'id' => $client_id, 'message' => $message_data['message']); return Gateway::sendToAll(WebSocket::encode(json_encode($new_message))); } }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $message) { // 如果是websocket握手 if (self::checkHandshake($message)) { // debug echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:{$client_id} onMessage:" . $message . "\n"; return; } // 判断是不是websocket的关闭连接的包 if (WebSocket::isClosePacket($message)) { return Gateway::kickClient($client_id); } // 解码websocket,得到原始数据 $message = WebSocket::decode($message); // debug //echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id session:".json_encode($_SESSION)." onMessage:".$message."\n"; // 客户端传递的是json数据 $data = json_decode($message, true); print_r($data); // 判断数据是否正确 if (empty($data['class']) || empty($data['method']) || !isset($data['param_array'])) { // 发送数据给客户端,请求包错误 $result = json_encode(array('code' => 400, 'msg' => 'bad request', 'data' => null)); return Gateway::sendToCurrentClient(WebSocket::encode($result)); } // 获得要调用的类、方法、及参数 $class = $data['class']; $method = $data['method']; $param_array = $data['param_array']; // 判断类对应文件是否载入 if (!class_exists($class)) { $include_file = ROOT_DIR . "/Services/{$class}.php"; if (is_file($include_file)) { require_once $include_file; } if (!class_exists($class)) { $code = 404; $msg = "class {$class} not found"; // 发送数据给客户端 类不存在 $result = json_encode(array('code' => $code, 'msg' => $msg, 'data' => null)); return Gateway::sendToCurrentClient(WebSocket::encode($result)); } } // 调用类的方法 try { $ret = call_user_func_array(array($class, $method), $param_array); // 发送数据给客户端,调用成功,data下标对应的元素即为调用结果 $result = json_encode(array('code' => 0, 'msg' => 'ok', 'data' => $ret)); return Gateway::sendToCurrentClient(WebSocket::encode($result)); } catch (Exception $e) { // 发送数据给客户端,发生异常,调用失败 $code = $e->getCode() ? $e->getCode() : 500; $result = json_encode(array('code' => $code, 'msg' => $e->getMessage(), 'data' => $e)); return Gateway::sendToCurrentClient(WebSocket::encode($result)); } }