/** * 当有用户连接时,会触发该方法 */ public static function onConnect($message) { // 通过message验证用户,并获得uid $uid = self::checkUser($message); // 不合法踢掉 if (!$uid) { // 返回失败 return GateWay::kickCurrentUser('登录失败'); } // [这步是必须的]合法,记录uid到gateway通信地址的映射 GateWay::storeUid($uid); // [这步是必须的]发送数据包到address对应的gateway,确认connection成功 GateWay::notifyConnectionSuccess($uid); // 向当前用户发送uid GateWay::sendToCurrentUid(json_encode(array('uid' => $uid)) . "\n"); // 广播所有用户,xxx connected GateWay::sendToAll(json_encode(array('from_uid' => 'SYSTEM', 'message' => "{$uid} come \n", 'to_uid' => 'all')) . "\n"); }
/** * 此链接的用户没调用GateWay::notifyConnectionSuccess($uid);前(即没有得到验证),都触发onConnect * 已经调用GateWay::notifyConnectionSuccess($uid);的用户有消息时,则触发onMessage * @param string $message 一般是传递的账号密码等信息 * @return void */ public static function onConnect($message) { /* * 通过message验证用户,并获得uid。 * 一般流程这里$message应该包含用户名 密码,然后根据用户名密码从数据库中获取uid * 这里只是根据时间戳生成uid,高并发下会有小概率uid冲突 */ $uid = self::checkUser($message); // 不合法踢掉 if (!$uid) { // 踢掉 return GateWay::kickCurrentUser(TextProtocol::encode('uid非法')); } $_SESSION['name'] = TextProtocol::decode($message); // [这步是必须的]合法,记录uid到gateway通信地址的映射 GateWay::storeUid($uid); // [这步是必须的]发送数据包到address对应的gateway,确认connection成功 GateWay::notifyConnectionSuccess($uid); Gateway::sendToCurrentUid("\nchart room login success, your uid is {$uid}, name is {$_SESSION['name']}\nuse uid:words send message to one user\nuse words send message to all\n"); // 广播所有用户,xxx come GateWay::sendToAll(TextProtocol::encode("{$_SESSION['name']}[{$uid}] come")); }