예제 #1
0
 public static function onMessage($client_id, $message)
 {
     // 获取客户端请求
     $message_data = json_decode($message, true);
     echo 'message' . $message . 'ID' . $client_id;
     if (!$message_data) {
         return;
     }
     //text-info 是系统发送的。text-user 是其他用户发送的。
     switch ($message_data['type']) {
         case 'JOIN':
             // 转播给所有用户
             Gateway::sendToAll(json_encode(array('type' => 'NOTE', 'id' => $client_id, 'text_type' => 'text-info', 'msg' => $message_data['user_nickname'] . '加入聊天。当前共有' . count(Gateway::getOnlineStatus()) . '把剪子在线。')));
             break;
         case 'QUIT':
             // 转播给所有用户
             GateWay::sendToAll(json_encode(array('type' => 'QUIT', 'msg' => $message_data['from'] . '退出聊天啦 T^T'), true));
             break;
         case 'EDIT':
             // 转播给所有用户
             Gateway::sendToAll(json_encode(array('type' => 'EDIT', 'from' => $message_data['from'], 'to' => $message_data['to'], 'head' => $message_data['head'])));
             break;
         case 'NAME':
             // var_export(Gateway::getOnlineStatus());
             // echo 'online num :'.count(Gateway::getOnlineStatus());
             $id = mt_rand(1, 9);
             Gateway::sendToCurrentClient('{"type":"NAME","head":"http://img3.178.com/acg1/201507/230072993522/230073874484.jpg","name":"剪纸' . $client_id . '号","msg":"大家好,剪纸' . $client_id . '号来啦。"}');
             echo 'NAME IS come ';
             break;
             // 更新用户
         // 更新用户
         case 'POST':
             // 转播给所有用户
             echo 'POST IS IN';
             Gateway::sendToAll(json_encode(array('type' => 'POST', 'from' => $message_data['from'], 'msg' => $message_data['context'], 'head' => $message_data['head'])));
             return;
             // 聊天
         // 聊天
         case 'message':
             // 向大家说
             $new_message = array('type' => 'message', 'id' => $client_id, 'message' => $message_data['message']);
             return Gateway::sendToAll(json_encode($new_message));
     }
 }
예제 #2
0
 /**
  * 添加到客户端列表中
  * @param int $client_id
  * @param string $client_name
  */
 public static function addClientToRoom($room_id, $client_id, $client_name)
 {
     $key = "ROOM_CLIENT_LIST-{$room_id}";
     $store = Store::instance('room');
     // 获取所有所有房间的实际在线客户端列表,以便将存储中不在线用户删除
     $all_online_client_id = Gateway::getOnlineStatus();
     // 存储驱动是memcached
     if (get_class($store) == 'Memcached') {
         $cas = 0;
         $try_count = 3;
         while ($try_count--) {
             $client_list = $store->get($key, null, $cas);
             if (false === $client_list) {
                 if ($store->getResultCode() == \Memcached::RES_NOTFOUND) {
                     $client_list = array();
                 } else {
                     throw new \Exception("Memcached->get({$key}) return false and memcache errcode:" . $store->getResultCode() . " errmsg:" . $store->getResultMessage());
                 }
             }
             if (!isset($client_list[$client_id])) {
                 // 将存储中不在线用户删除
                 if ($all_online_client_id && $client_list) {
                     $all_online_client_id = array_flip($all_online_client_id);
                     $client_list = array_intersect_key($client_list, $all_online_client_id);
                 }
                 // 添加在线客户端
                 $client_list[$client_id] = $client_name;
                 // 原子添加
                 if ($store->getResultCode() == \Memcached::RES_NOTFOUND) {
                     $store->add($key, $client_list);
                 } else {
                     $store->cas($cas, $key, $client_list);
                 }
                 if ($store->getResultCode() == \Memcached::RES_SUCCESS) {
                     return $client_list;
                 }
             } else {
                 return $client_list;
             }
         }
         throw new \Exception("addClientToRoom({$room_id}, {$client_id}, {$client_name})->cas({$cas}, {$key}, \$client_list) fail ." . $store->getResultMessage());
     } else {
         $handler = fopen(__FILE__, 'r');
         flock($handler, LOCK_EX);
         $client_list = $store->get($key);
         if (!isset($client_list[$client_id])) {
             // 将存储中不在线用户删除
             if ($all_online_client_id && $client_list) {
                 $all_online_client_id = array_flip($all_online_client_id);
                 $client_list = array_intersect_key($client_list, $all_online_client_id);
             }
             // 添加在线客户端
             $client_list[$client_id] = $client_name;
             $ret = $store->set($key, $client_list);
             flock($handler, LOCK_UN);
             return $client_list;
         }
         flock($handler, LOCK_UN);
     }
     return $client_list;
 }
예제 #3
0
파일: Event.php 프로젝트: hongbo819/webChat
 /**
  * 存储用户到在线列表
  * @param int $client_id
  * @param string $clientName
  */
 public static function addUserToOnlineList($clientId, $clientName)
 {
     $key = Storekey::USER_ONLINE_LIST;
     // 获取所有所有在线用户clientid--------------
     $allOnlineClientId = Gateway::getOnlineStatus();
     //获取存储中在线用户列表
     $clientList = Muser::getOnlineUsers();
     if (isset($clientList[$clientId])) {
         return true;
     }
     //是否允许多用户登录,剔除用户的clientid
     if (\Config\St\Status::NOT_ALLOW_CLIENTS) {
         self::notAllowMoreClient($clientList, $clientName);
     }
     // 将存储中不在线用户删除
     self::deleteOfflineUser($clientList, $allOnlineClientId);
     // 添加   时间默认是一天
     if (RedisModel::hashSet('webChat', $key, $clientId, $clientName)) {
         return true;
     }
     return false;
 }