Пример #1
0
 /**
  * 有消息时
  * @param int $client_id
  * @param string $message
  */
 public static function onMessage($client_id, $message)
 {
     // debug
     echo "\n";
     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数据
     $message_data = json_decode($message, true);
     if (!$message_data) {
         echo "无效请求\n";
         return;
     }
     if (@$message_data['hash']) {
         $hash = $message_data['hash'];
         $time = $message_data['time'];
         $uid = $message_data['id'];
         $md = md5($uid . $time . 'xiaolin');
         if ($md == $hash) {
             $_SESSION['uid'] = $uid;
             return;
         } else {
             $new_message = array('type' => 'err', 'msg' => '请求失效');
             Gateway::sendToCurrentClient(json_encode($new_message));
             return;
         }
     } else {
         if (!$_SESSION['uid']) {
             $new_message = array('type' => 'err', 'msg' => '请求失效');
             Gateway::sendToCurrentClient(json_encode($new_message));
             return;
         }
     }
     // 根据类型执行不同的业务
     switch ($message_data['type']) {
         // 客户端回应服务端的心跳
         case 'pong':
             return;
         case 'login':
             if ($_SESSION['room_id']) {
                 return;
             }
             $method = $message_data['method'];
             switch ($method) {
                 case 'new':
                     $room_id = self::rand_room_id();
                     break;
                 case 'join':
                     $room_id = $message_data['room_id'];
                     echo "room_id: {$room_id} \n";
                     $count = Gateway::getClientCountByGroup($room_id);
                     if ($count != 1) {
                         $msg = $count ? '房间已满' : '房间是空的';
                         $new_message = array('type' => 'for_login', 'status' => false, 'msg' => $msg);
                         Gateway::sendToClient($client_id, $new_message);
                         return;
                     }
                     break;
                 case 'quick':
                     for ($i = 1; $i <= 5; $i++) {
                         $count = Gateway::getClientCountByGroup($i);
                         $cc[$i] = $count;
                         if ($count == 1) {
                             $room_id = $i;
                             break;
                         }
                     }
                     if (!$room_id) {
                         for ($i = 1; $i <= 5; $i++) {
                             $count = $cc[$i];
                             if ($count == 0) {
                                 $room_id = $i;
                                 break;
                             }
                         }
                     }
                     if (!$room_id) {
                         $new_message = array('type' => 'for_login', 'status' => false, 'msg' => '房间已满');
                         Gateway::sendToClient($client_id, $new_message);
                         return;
                     }
                     break;
             }
             // 把房间号昵称放到session中
             echo "加入房间 room_id: {$room_id} \n";
             $client_name = $message_data['client_name'];
             $_SESSION['room_id'] = $room_id;
             $_SESSION['client_name'] = $client_name;
             $_SESSION['ready'] = 'false';
             // 获取房间内所有用户列表
             $clients_list = Gateway::getClientInfoByGroup($room_id);
             echo "房间人数 : " . count($clients_list) . " \n";
             if (count($clients_list)) {
                 foreach ($clients_list as $key => $value) {
                     $opp_name = $value['client_name'];
                     $opp_ready = $value['ready'];
                     $new_message = array('type' => 'game', 'fun' => "add_opp('{$client_name}')");
                     Gateway::sendToClient($key, json_encode($new_message));
                 }
             } else {
                 echo "加入空房间  \n";
                 $opp_name = '';
                 $opp_ready = 'false';
             }
             Gateway::joinGroup($client_id, $room_id);
             $new_message = array('type' => 'game', 'fun' => "init( {room_id:'{$room_id}',opp_name:'{$opp_name}',opp_ready:{$opp_ready} })");
             Gateway::sendToCurrentClient(json_encode($new_message));
             return;
         case 'ready':
             $room_id = $_SESSION['room_id'];
             $_SESSION['ready'] = 'true';
             $clients_list = Gateway::getClientInfoByGroup($room_id);
             if (count($clients_list)) {
                 foreach ($clients_list as $key => $value) {
                     if ($key != $client_id) {
                         if ($value['ready'] == 'true') {
                             $new_message = array('type' => 'game', 'fun' => "start()");
                             Gateway::sendToGroup($room_id, json_encode($new_message));
                             sleep(3);
                             $arr = self::rand_arr(1);
                             $jso = json_encode($arr);
                             $new_message = array('type' => 'game', 'fun' => "level_start(1,'{$jso}')");
                             Gateway::sendToGroup($room_id, json_encode($new_message));
                         } else {
                             $new_message = array('type' => 'game', 'fun' => "opp_ready()");
                             Gateway::sendToClient($key, json_encode($new_message));
                         }
                     }
                 }
             }
             return;
         case 'start':
             $_SESSION['ready'] = 'false';
             return;
         case 'touch':
             $room_id = $_SESSION['room_id'];
             $level = $message_data['level'];
             $finish = $message_data['finish'];
             $clients_list = Gateway::getClientInfoByGroup($room_id);
             foreach ($clients_list as $key => $value) {
                 $right = $message_data['right'] ? 'true' : 'false';
                 if ($finish && $key != $client_id && $value['finish']) {
                     //双方完成
                     if ($message_data['right'] == $value['right']) {
                         //下一关
                         $new_message = array('type' => 'game', 'fun' => "opp_touch({$message_data['i']},{$right})");
                         Gateway::sendToClient($key, json_encode($new_message));
                         $new_message = array('type' => 'game', 'fun' => "level_end()");
                         Gateway::sendToGroup($room_id, json_encode($new_message));
                         $up = $message_data['right'] ? 1 : -1;
                         $level = $level + $up;
                         $level < 1 && ($level = 1);
                         $arr = self::rand_arr($level);
                         $jso = json_encode($arr);
                         $new_message = array('type' => 'game', 'fun' => "level_start({$level},'{$jso}')");
                         Gateway::sendToGroup($room_id, json_encode($new_message));
                     } else {
                         //游戏结束
                         $new_message = array('type' => 'game', 'fun' => "opp_touch({$message_data['i']},{$right})");
                         Gateway::sendToClient($key, json_encode($new_message));
                         $win = $message_data['right'] ? 'true' : 'false';
                         $new_message = array('type' => 'game', 'fun' => "end({$win})");
                         Gateway::sendToClient($client_id, json_encode($new_message));
                         $win = $value['right'] ? 'true' : 'false';
                         $new_message = array('type' => 'game', 'fun' => "end({$win})");
                         Gateway::sendToClient($key, json_encode($new_message));
                         return;
                     }
                 } else {
                     if ($key != $client_id) {
                         $_SESSION['finish'] = $message_data['finish'];
                         $_SESSION['right'] = $message_data['right'];
                         $new_message = array('type' => 'game', 'fun' => "opp_touch({$message_data['i']},{$right})");
                         Gateway::sendToClient($key, json_encode($new_message));
                     }
                 }
             }
             return;
         case 'level_start':
             $_SESSION['finish'] = FALSE;
             $_SESSION['right'] = TRUE;
             return;
         case 'timeout':
             $room_id = $_SESSION['room_id'];
             $level = $message_data['level'];
             $finish = $message_data['finish'];
             $clients_list = Gateway::getClientInfoByGroup($room_id);
             foreach ($clients_list as $key => $value) {
                 if ($finish && $key != $client_id && $value['finish']) {
                     //双方完成
                     if ($message_data['right'] == $value['right']) {
                         //下一关
                         echo "下一关  \n";
                         $up = $message_data['right'] ? 1 : -1;
                         $level = $level + $up;
                         $level < 1 && ($level = 1);
                         $arr = self::rand_arr($level);
                         $jso = json_encode($arr);
                         $new_message = array('type' => 'game', 'fun' => "level_start({$level},'{$jso}')");
                         Gateway::sendToGroup($room_id, json_encode($new_message));
                     } else {
                         //游戏结束
                         echo "游戏结束  \n";
                         $win = $message_data['right'] ? 'true' : 'false';
                         $new_message = array('type' => 'game', 'fun' => "end({$win})");
                         Gateway::sendToClient($client_id, json_encode($new_message));
                         $win = $value['right'] ? 'true' : 'false';
                         $new_message = array('type' => 'game', 'fun' => "end({$win})");
                         Gateway::sendToClient($key, json_encode($new_message));
                         return;
                     }
                 } else {
                     if ($key != $client_id) {
                         echo "等待对方完成  \n";
                         $_SESSION['finish'] = TRUE;
                         $_SESSION['right'] = FALSE;
                     }
                 }
             }
             return;
         case 'out':
             $room_id = $_SESSION['room_id'];
             Gateway::leaveGroup($client_id, $room_id);
             unset($_SESSION['room_id']);
             $new_message = array('type' => 'game', 'fun' => 'rm_opp()');
             Gateway::sendToGroup($room_id, json_encode($new_message));
             break;
         case 'init':
             $_SESSION['ready'] = 'false';
             break;
     }
 }