/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $message) { // 获取客户端请求 $message_data = json_decode($message, true); if (!$message_data) { return; } switch ($message_data['type']) { case 'login': Gateway::sendToCurrentClient('{"type":"welcome","id":' . $client_id . '}'); break; // 更新用户 // 更新用户 case 'update': // 转播给所有用户 Gateway::sendToAll(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(json_encode($new_message)); } }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $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数据 $message_data = json_decode($message, true); if (!$message_data) { return; } // 根据类型执行不同的业务 switch ($message_data['type']) { // 客户端回应服务端的心跳 case 'pong': return; // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 case 'login': // 判断是否有房间号 if (!isset($message_data['room_id'])) { throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:{$message}"); } // 把房间号昵称放到session中 $room_id = $message_data['room_id']; $client_name = htmlspecialchars($message_data['client_name']); $_SESSION['room_id'] = $room_id; $_SESSION['client_name'] = $client_name; // 获取房间内所有用户列表 $clients_list = Gateway::getClientInfoByGroup($room_id); foreach ($clients_list as $tmp_client_id => $item) { $clients_list[$tmp_client_id] = $item['client_name']; } $clients_list[$client_id] = $client_name; // 转播给当前房间的所有客户端,xx进入聊天室 message {type:login, client_id:xx, name:xx} $new_message = array('type' => $message_data['type'], 'client_id' => $client_id, 'client_name' => htmlspecialchars($client_name), 'time' => date('Y-m-d H:i:s')); Gateway::sendToGroup($room_id, json_encode($new_message)); Gateway::joinGroup($client_id, $room_id); // 给当前用户发送用户列表 $new_message['client_list'] = $clients_list; Gateway::sendToCurrentClient(json_encode($new_message)); return; // 客户端发言 message: {type:say, to_client_id:xx, content:xx} // 客户端发言 message: {type:say, to_client_id:xx, content:xx} case 'say': // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; // 私聊 if ($message_data['to_client_id'] != 'all') { $new_message = array('type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => $message_data['to_client_id'], 'content' => "<b>对你说: </b>" . nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message)); $new_message['content'] = "<b>你对" . htmlspecialchars($message_data['to_client_name']) . "说: </b>" . nl2br(htmlspecialchars($message_data['content'])); return Gateway::sendToCurrentClient(json_encode($new_message)); } $new_message = array('type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => 'all', 'content' => nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); return Gateway::sendToGroup($room_id, json_encode($new_message)); } }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $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数据 $message_data = json_decode($message, true); if (!$message_data) { return; } // 根据类型执行不同的业务 switch ($message_data['type']) { // 客户端回应服务端的心跳 case 'pong': return; // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 case 'login': case 're_login': // 判断是否有房间号 if (!isset($message_data['room_id'])) { throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:{$message}"); } // 把房间号昵称放到session中 $room_id = $message_data['room_id']; $client_name = htmlspecialchars($message_data['client_name']); $_SESSION['room_id'] = $room_id; $_SESSION['client_name'] = $client_name; // 存储到当前房间的客户端列表 $all_clients = self::addClientToRoom($room_id, $client_id, $client_name); // 整理客户端列表以便显示 $client_list = self::formatClientsData($all_clients); // 转播给当前房间的所有客户端,xx进入聊天室 message {type:login, client_id:xx, name:xx} $new_message = array('type' => $message_data['type'], 'client_id' => $client_id, 'client_name' => htmlspecialchars($client_name), 'client_list' => $client_list, 'time' => date('Y-m-d H:i:s')); $client_id_array = array_keys($all_clients); Gateway::sendToAll(json_encode($new_message), $client_id_array); return; // 客户端发言 message: {type:say, to_client_id:xx, content:xx} // 客户端发言 message: {type:say, to_client_id:xx, content:xx} case 'say': // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; // 私聊 if ($message_data['to_client_id'] != 'all') { $new_message = array('type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => $message_data['to_client_id'], 'content' => "<b>对你说: </b>" . nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message)); $new_message['content'] = "<b>你对" . htmlspecialchars($message_data['to_client_name']) . "说: </b>" . nl2br(htmlspecialchars($message_data['content'])); return Gateway::sendToCurrentClient(json_encode($new_message)); } // 向大家说 $all_clients = self::getClientListFromRoom($_SESSION['room_id']); $client_id_array = array_keys($all_clients); $new_message = array('type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => 'all', 'content' => nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); return Gateway::sendToAll(json_encode($new_message), $client_id_array); } }
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)); } }
private function login($client_id, $message_data) { // 判断是否有房间号 if (!isset($message_data['room_id'])) { throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:{$message}"); } //获取用户客户端登陆的身份 $uid = $message_data['uid']; $room_id = $message_data['room_id']; //获取用户提交上来的 房间号 $_SESSION['room_id'] = $room_id; //将房间号存入 session $memcache = new Memcache(); //从缓存服务器中取出当前登陆用户的信息 $userInfo = $memcache->getUserInfo($uid); //从缓存服务器 $_SESSION['userInfo'] = $userInfo; //把缓存数据 存进session 绑定当前连接用户 $_SESSION['client_name'] = $userInfo['nick_name'] ? $userInfo['nick_name'] : $userInfo['username']; // 获取房间内所有用户列表 $clients_list = Gateway::getClientInfoByGroup($room_id); foreach ($clients_list as $tmp_client_id => $item) { $clients_list[$tmp_client_id] = ['uid' => $item['userInfo']['id'], 'client_name' => $item['userInfo']['nick_name'] ? $item['userInfo']['nick_name'] : $item['userInfo']['username'], 'head_portrait' => $item['userInfo']['head_portrait']]; } $clients_list[$client_id] = ['uid' => $userInfo['id'], 'client_name' => $userInfo['nick_name'] ? $userInfo['nick_name'] : $userInfo['username'], 'head_portrait' => $userInfo['head_portrait']]; $id = Gateway::getClientIdByUid($uid); //获取id 绑定下的 client_id 1对多关系 if (empty($id)) { //新用户登陆 // 转播给当前房间的所有客户端,xx进入聊天室 message {type:login, client_id:xx, name:xx} $new_message = array('type' => $message_data['type'], 'client_id' => $client_id, 'uid' => $uid, 'head_portrait' => $userInfo['head_portrait'], 'client_name' => $_SESSION['client_name'], 'time' => date('Y-m-d H:i:s')); Gateway::sendToGroup($room_id, json_encode($new_message)); // 发送所有人 Gateway::joinGroup($client_id, $room_id); //将当前连接人 添加到房间内 Gateway::bindUid($client_id, $uid); //将当前连接人 绑定用户id 1对多关系 } else { //页面多开 Gateway::bindUid($client_id, $uid); //将当前连接人 绑定用户id 1对多关系 } // 给当前用户发送用户列表 $new_message['client_list'] = $clients_list; Gateway::sendToCurrentClient(json_encode($new_message)); return; }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $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数据 $message = str_replace("script", "'script'" , $message); $message_data = json_decode($message, true); if(!$message_data) { return ; } // echo $message_data['type']; // 根据类型执行不同的业务 switch($message_data['type']) { // 客户端回应服务端的心跳 case 'pong': return; // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 case 'login': //是否已登录 // $exist = (bool)false; //client_id 和 uid 绑定 $logined = Gateway::getClientIdByUid($message_data['uid']); //绑定uid Gateway::bindUid($client_id, $message_data['uid']); // 把房间号昵称放到session中 $room_id = $message_data['room_id']; $uid = $message_data['uid']; // 判断是否有房间号 if(!isset($message_data['room_id'])) { throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message"); } $client_name = htmlspecialchars($message_data['client_name']); $_SESSION['room_id'] = $room_id; $_SESSION['client_name'] = $client_name; $_SESSION['uid'] = $uid; $_SESSION['header_img_url'] = $message_data['header_img_url']; // 获取房间内所有用户列表 $clients_list = Gateway::getClientInfoByGroup($room_id); foreach($clients_list as $tmp_client_id=>$item) { $clients_list[$tmp_client_id]['client_name'] = $item['client_name']; $clients_list[$tmp_client_id]['uid'] = $item['uid']; } //判断是否已登陆 if (empty($logined)) { $clients_list[$client_id]['client_name'] = htmlspecialchars($client_name); $clients_list[$client_id]['uid'] = $uid; $new_message = array('type'=>$message_data['type'], 'client_list'=>$clients_list, 'time'=>date('Y-m-d H:i:s')); Gateway::sendToGroup($room_id, json_encode($new_message)); // 给当前用户发送用户列表 $new_message['client_list'] = $clients_list; Gateway::sendToCurrentClient(json_encode($new_message)); } else { print_r($clients_list); // 给当前用户发送用户列表 $new_message['client_list'] = $clients_list; Gateway::sendToCurrentClient(json_encode($new_message)); } Gateway::joinGroup($client_id, $room_id); return; // 客户端发言 message: {type:say, to_client_id:xx, content:xx} case 'say': // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; // 私聊 if($message_data['to_client_id'] != 'all') { $new_message = array( 'type'=>'say', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'to_client_id'=>$message_data['to_client_id'], 'content'=>"<b>对你说: </b>".nl2br(htmlspecialchars($message_data['content'])), 'time'=>date('Y-m-d H:i:s'), ); Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message)); $new_message['content'] = "<b>你对".htmlspecialchars($message_data['to_client_name'])."说: </b>".nl2br(htmlspecialchars($message_data['content'])); return Gateway::sendToCurrentClient(json_encode($new_message)); } $new_message = array( 'type'=>'say', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'to_client_id'=>'all', 'content'=>nl2br(htmlspecialchars($message_data['content'])), 'time'=>date('Y-m-d H:i:s'), ); return Gateway::sendToGroup($room_id ,json_encode($new_message)); case 'say_uid': $db1 = Db::instance('oms'); // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; $uid = $_SESSION['uid']; // 私聊 $message_content = $message_data['content']; if($message_data['to_uid_id'] !== 'all') { $new_message = array( 'type'=>'say_uid', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'from_uid_id'=>$uid, 'groupId'=>$message_data['groupId'], 'mestype'=>$message_data['message_type'], 'content'=>$message_content, 'time'=>date('Y-m-d H:i:s'), ); if ($message_data['message_type'] == "message") { $session_no = $uid > $message_data['to_uid_id'] ? $message_data['to_uid_id']."-".$uid : $uid."-".$message_data['to_uid_id']; $new_message['mestype'] = "message"; $to_uid = $message_data['to_uid_id']; } else { //验证是否在群聊 $va = $db1->query("SELECT `group_participants`, `group_name` FROM `oms_group_chat` WHERE `id`=".$message_data['session_no']); $arrVa = explode(',', $va[0]['group_participants']); if (!in_array($uid, $arrVa)) { return ; } $session_no = $message_data['session_no']; $new_message['mestype'] = "groupMessage"; $new_message['group_name'] = $va[0]['group_name']; $message_data['to_uid_id'] = $va[0]['group_participants']; $new_message['to_uid_id'] = $va[0]['group_participants']; foreach ($arrVa as $key => $value) { if ($value == $uid) { unset($arrVa[$key]); } } $to_uid = $arrVa; } $insert_id = $db1->insert('oms_string_message')->cols(array('room_id'=>$room_id, 'sender_id'=>$uid,'accept_id'=>$message_data['to_uid_id'], 'sender_name'=>$client_name, 'accept_name'=>$message_data['accept_name'],'message_type'=>$message_data['message_type'], 'groupId'=>$message_data['groupId'], 'message_content'=>$message_content, 'session_no'=>$session_no, 'create_time'=>time(), 'update_time'=>time()))->query(); $new_message['insert_id'] = $insert_id; $new_message['session_no'] = $session_no; if ($message_data['message_type'] == "groupMessage") { $db1->query("UPDATE `oms_groups_people` SET `mes_state`=1, `mes_id`=".$insert_id." WHERE `staffid` != $uid AND `pid`=".$message_data['session_no']); } Gateway::sendToUid($to_uid, json_encode($new_message)); return ; } // 组聊 $new_message = array( 'type'=>'say_uid', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'to_client_id'=>'all', 'content'=>"{$client_name}说: ".nl2br(htmlspecialchars($message_data['content'])), 'time'=>date('Y-m-d H:i:s'), ); $insert_id = $db1->insert('oms_string_message')->cols(array('room_id'=>$room_id, 'sender_id'=>$message_data['senderid'],'accept_id'=>0,'accept_name'=>$client_name ,'message_type'=>$message_data['message_type'], 'message_content'=>nl2br(htmlspecialchars($message_data['content'])), 'create_time'=>time(), 'update_time'=>time()))->query(); return Gateway::sendToGroup($room_id ,json_encode($new_message)); //审核消息 case 'audit': $db1 = Db::instance('oms'); // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; $uid = $_SESSION['uid']; // 私聊 if($message_data['to_uid_id'] != 'all') { $new_message = array( 'message_url'=>$message_data['message_url'], 'type'=>'audit', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'content'=>nl2br(htmlspecialchars($message_data['content'])), 'time'=>date('Y-m-d H:i:s'), ); // Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message)); $newTime = time(); $session_no = $newTime.$client_id; if (!empty($message_data['to_uid_id'])) { foreach ($message_data['to_uid_id'] as $key => $value) { $arrValue[] = "($value, '".$message_data['senderid']."', '".$message_data['message_type']."', '".$message_data['content']."', '1', '".$message_data['message_url']."', '".$session_no."', ".$newTime.", ".$newTime.")"; } } $value = implode(',', $arrValue); //插入数据 $insert_id = $db1->query("INSERT INTO `oms_string_message` (`accept_id`, `sender_id`, `message_type`, `message_content`, `oms_id`, `message_url`, `session_no`, `create_time`, `update_time`) VALUE".$value); $new_message['session_no'] = $session_no; Gateway::sendToUid($message_data['to_uid_id'], json_encode($new_message)); return ; } // 组聊 $new_message = array( 'type'=>'say_uid', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'to_client_id'=>'all', 'content'=>"{$client_name}说: ".nl2br(htmlspecialchars($message_data['content'])), 'time'=>date('Y-m-d H:i:s'), ); $insert_id = $db1->insert('oms_string_message')->cols(array('room_id'=>$room_id, 'sender_id'=>$message_data['senderid'],'accept_id'=>0,'accept_name'=>$client_name ,'message_type'=>$message_data['message_type'], 'message_content'=>nl2br(htmlspecialchars($message_data['content'])), 'create_time'=>time(), 'update_time'=>time()))->query(); return Gateway::sendToGroup($room_id ,json_encode($new_message)); return; //数据操作消息的关闭 case 'mes_close': $db1 = Db::instance('oms'); // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $mesid = $message_data['mesid']; $session_no = $message_data['session_no']; $uid = $_SESSION['uid']; if ($message_data['mestype'] == 'message') { $db1->query("UPDATE `oms_string_message` SET `state`=1 WHERE `id`= "."'{$mesid}'"); } else { $db1->query("UPDATE `oms_groups_people` SET `mes_state`=0 WHERE `staffid`=$uid AND `pid`=".$session_no); } return ; // 选择人后聊天信息 case 'mes_chat': $db1 = Db::instance('oms'); // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $uid = $_SESSION['uid']; $session_no = $uid < $message_data['mes_para'] ? $uid."-".$message_data['mes_para'] : $message_data['mes_para']."-".$uid; $mes_list = $db1->query("SELECT `id`, `message_content`, `create_time`, `sender_name`, `sender_id` FROM `oms_string_message` WHERE `delState` = 0 AND `session_no`= "."'{$session_no}' ORDER BY create_time desc limit 0, 10"); if (!empty($mes_list)) { foreach ($mes_list as $key => $value) { $mes_list[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']); } } $mes_list['type'] = 'mes_chat'; Gateway::sendToClient($client_id, json_encode($mes_list)); return; //滚动消息的分页 case 'mes_load': $db1 = Db::instance('oms'); // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $uid = $_SESSION['uid']; if ($message_data['message_type'] == "message") { //会话id $session_no = $uid > $message_data['to_uid'] ? $message_data['to_uid']."-".$uid : $uid."-".$message_data['to_uid']; } else { //验证是否在群聊 $va = $db1->query("SELECT `group_participants` FROM `oms_group_chat` WHERE `id`=".$message_data['session_no']); $arrVa = explode(',', $va[0]['group_participants']); if (!in_array($uid, $arrVa)) { return ; } //会话id $session_no = $message_data['session_no']; } if (!empty($message_data['mes_loadnum'])) { $onlode = $db1->query("SELECT `id`, `message_content`, `create_time`, `accept_name`, `sender_id`, `sender_name` FROM `oms_string_message` WHERE `delState` = 0 AND `session_no`= "."'{$session_no}' ORDER BY create_time desc limit ".$message_data['mes_loadnum'].", 10"); if (!empty($onlode)) { foreach ($onlode as $key => $value) { $onlode[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']); } $onlode['type'] = 'onlode'; $onlode['save'] = 1; } else { $onlode['type'] = 'onlode'; $onlode['save'] = 0; } Gateway::sendToClient($client_id, json_encode($onlode)); } return ; //群聊 case 'mes_groupChat': $db1 = Db::instance('oms'); // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $uid = $_SESSION['uid']; $arrYanzhng = explode(',', $message_data['groupvalue']); if (!in_array($uid, $arrYanzhng)) { return ; } $group_mes_list = $db1->query("SELECT `id`, `message_content`, `create_time`, `sender_name`, `sender_id` FROM `oms_string_message` WHERE `delState` = 0 AND `session_no`= '".$message_data['session_no']."' ORDER BY create_time desc limit 0, 10"); if (!empty($group_mes_list)) { foreach ($group_mes_list as $key => $value) { $group_mes_list[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']); } } $group_mes_list['type'] = 'mes_chat'; Gateway::sendToClient($client_id, json_encode($group_mes_list)); return; case 'recentcClose': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; $db1->query("UPDATE `oms_string_message` SET `delState` = 1 WHERE `session_no` = '".$message_data['session']."'"); return; case 'addGroupMan': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; $arrAddGroupMan = $db1->query("SELECT `group_participants`,`group_name` FROM `oms_group_chat` WHERE id=".$message_data['session_no']); $arr = explode(",", $arrAddGroupMan[0]['group_participants']); if (!in_array($uid, $arr)) { return; } foreach ($message_data['sidList'] as $key => $value) { if (!in_array($value, $arr)) { $arr[] = $value; $addMan[] = $value; } } $sAddGroupMan = implode(",", $arr); foreach ($addMan as $k => $val) { $arrvalue[] = "('".$message_data['session_no']."', '".$val."', '".$arrAddGroupMan[0]['group_name']."', ".time()." ,".time().")"; } $strvalue = implode(",", $arrvalue); $db1->query("INSERT INTO `oms_groups_people` (`pid`, `staffid`, `group_name`, `create_time`, `update_time`) value".$strvalue); $db1->query("UPDATE `oms_group_chat` SET `group_participants`='".$sAddGroupMan."' WHERE id=".$message_data['session_no']); $db1->query("UPDATE `oms_groups_people` SET `all_staffid`='".$sAddGroupMan."' WHERE `pid`=".$message_data['session_no']); return; case 'delgroupman': $uid = $_SESSION['uid']; $id = $message_data['id']; $db1 = Db::instance('oms'); $arrgrouppeople = $db1->query("SELECT * FROM `oms_groups_people` WHERE `id`=".$message_data['groupid']); $arrjoinGroup = explode(',', $arrgrouppeople[0]['all_staffid']); foreach ($arrjoinGroup as $key => $value) { if ($value == $id) { unset($arrjoinGroup[$key]); } } $unarrjoinGroup = $arrjoinGroup; $unstrgroupman = implode(",", $unarrjoinGroup); if (in_array($uid, explode(',', $arrgrouppeople[0]['all_staffid']))) { echo "UPDATE `oms_groups_people` SET `all_staffid`= '".$unstrgroupman."' WHERE `pid`=".$arrgrouppeople[0]['pid']; $db1->query("UPDATE `oms_groups_people` SET `all_staffid`= '".$unstrgroupman."' WHERE `pid`=".$arrgrouppeople[0]['pid']); $db1->query("UPDATE `oms_groups_people` SET `state`= 1 WHERE `id`=".$message_data['groupid']); $db1->query("UPDATE `oms_group_chat` SET `group_participants`= '".$unstrgroupman."' WHERE `id`=".$arrgrouppeople[0]['pid']); } return ; case 'active': // 非法请求 if(!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; // 私聊 if($message_data['to_uid_id'] != 'all') { $new_message = array( 'type'=>'say', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'to_client_id'=>$message_data['to_client_id'], 'content'=>"<b>对你说: </b>".nl2br(htmlspecialchars($message_data['content'])), 'time'=>date('Y-m-d H:i:s'), ); Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message)); $new_message['content'] = "<b>你对".htmlspecialchars($message_data['to_client_name'])."说: </b>".nl2br(htmlspecialchars($message_data['content'])); return Gateway::sendToCurrentClient(json_encode($new_message)); } $new_message = array( 'type'=>'say', 'from_client_id'=>$client_id, 'from_client_name' =>$client_name, 'to_client_id'=>'all', 'content'=>nl2br(htmlspecialchars($message_data['content'])), 'time'=>date('Y-m-d H:i:s'), ); return Gateway::sendToGroup($room_id ,json_encode($new_message)); } }
/** * 当客户端发来消息时触发 * @param int * @param string * @return void */ public static function onMessage($client_id, $message) { /** * 得到客户端的IP和端口号 * var_dump($_SERVER['REMOTE_ADDR'].':'.$_SERVER['REMOTE_PORT']); */ // 数据库实例 $connectHC = Db::instance('ConnectHC'); // 接收到心跳包 if (!is_array($message)) { // 回复心跳包 Gateway::sendToCurrentClient(1); } else { if (null === self::$redisConnection->get($client_id)) { // macid是有效id if (self::isMacId($message['macid'])) { self::connectionMacId($client_id, $message['macid']); return; } Gateway::sendToCurrentClient('fail'); } else { Gateway::sendToCurrentClient(1); // 更新蓝牙连接标志 if (isset($message['sign'])) { $sign = $message['sign']; $data = $connectHC->query("UPDATE `WEBHC` SET `sign` = {$sign} WHERE clientid='{$client_id}'"); Gateway::sendToCurrentClient(self::SUCCESS_SET_SIGN); return; } // 更新CLIENTID if (isset($message['macid']) && self::isMacId($message['macid'])) { self::connectionMacId($client_id, $message['macid']); return; } // 更新APP键名 $param = $connectHC->row("SELECT `param` FROM `WEBHC` WHERE clientid='{$client_id}'"); $parambefore = explode('/', $param['param']); foreach ($message as $key => $value) { $parambefore[$key - 1] = $value; } $paramafter = implode('/', $parambefore); $connectHC->query("UPDATE `WEBHC` SET `param` = '{$paramafter}' WHERE clientid='{$client_id}'"); } } }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $data) { Gateway::sendToCurrentClient(array('stat' => 100, 'text' => 'no login', 'data' => null)); }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $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数据 $adminUid = 1; $message = str_replace("script", "'script'", $message); $message_data = json_decode($message, true); if (!$message_data) { return; } // echo $message_data['type']; // 根据类型执行不同的业务 switch ($message_data['type']) { // 客户端回应服务端的心跳 case 'pong': return; // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 case 'login': //是否已登录 $exist = (bool) true; //未登录 //client_id 和 uid 绑定 if (isset($_SESSION['uid'])) { $uid = $_SESSION['uid']; $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; $header_img_url = $_SESSION['header_img_url']; $exist = (bool) false; } else { // 把房间号昵称放到session中 $room_id = $message_data['room_id']; $client_name = htmlspecialchars($message_data['client_name']); $uid = $message_data['uid']; $header_img_url = $message_data['header_img_url']; $_SESSION['room_id'] = $room_id; $_SESSION['client_name'] = $client_name; $_SESSION['uid'] = $uid; $_SESSION['header_img_url'] = $message_data['header_img_url']; } $logined = Gateway::getClientIdByUid($uid); //绑定uid Gateway::bindUid($client_id, $uid); // 判断是否有房间号 if (!isset($room_id)) { throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:{$message}"); } // 获取房间内所有用户列表 $clients_list = Gateway::getClientInfoByGroup($room_id); // print_r($clients_list); foreach ($clients_list as $tmp_client_id => $item) { $new_clients_list[$item['uid']]['client_name'] = $item['client_name']; $new_clients_list[$item['uid']]['header_img_url'] = $item['header_img_url']; } //判断是否已登陆 $new_message = array('type' => 'login', 'client_list' => $clients_list, 'time' => date('Y-m-d H:i:s')); if (empty($logined)) { //未登录 //管理员在线发送login次数加一; $adminOnline = Gateway::getClientIdByUid(1); if (!empty($adminOnline)) { $adminlogin = ['type' => 'adminLoginNum']; Gateway::sendToUid($adminUid, json_encode($adminlogin)); } $new_clients_list[$uid]['client_name'] = htmlspecialchars($client_name); $new_clients_list[$uid]['header_img_url'] = $header_img_url; $new_message['client_list'] = $new_clients_list; Gateway::sendToGroup($room_id, json_encode($new_message)); // 给当前用户发送用户列表 Gateway::sendToCurrentClient(json_encode($new_message)); Gateway::joinGroup($client_id, $room_id); //管理员获取所有人的在线人数 } else { //已登陆 // 给当前用户发送用户列表 $new_message['client_list'] = $new_clients_list; Gateway::sendToCurrentClient(json_encode($new_message)); } Gateway::joinGroup($client_id, $room_id); return; // 客户端发言 message: {type:say_uid, to_client_id:xx, content:xx} // 客户端发言 message: {type:say_uid, to_client_id:xx, content:xx} case 'say_uid': $db1 = Db::instance('oms'); // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; $uid = $_SESSION['uid']; // 私聊 $message_content = $message_data['content']; if ($message_data['to_uid_id'] !== 'all') { $new_message = array('type' => 'say_uid', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'from_uid_id' => $uid, 'groupId' => $message_data['groupId'], 'mestype' => $message_data['message_type'], 'content' => $message_content, 'time' => date('Y-m-d H:i:s')); if ($message_data['message_type'] == "message") { $session_no = $uid > $message_data['to_uid_id'] ? $message_data['to_uid_id'] . "-" . $uid : $uid . "-" . $message_data['to_uid_id']; $new_message['mestype'] = "message"; $to_uid = $message_data['to_uid_id']; } else { //验证是否在群聊 $va = $db1->query("SELECT `group_participants`, `group_name` FROM `oms_group_chat` WHERE `id`=" . $message_data['session_no']); $arrVa = explode(',', $va[0]['group_participants']); if (!in_array($uid, $arrVa)) { return; } $session_no = $message_data['session_no']; $new_message['mestype'] = "groupMessage"; $new_message['group_name'] = $va[0]['group_name']; $message_data['to_uid_id'] = $va[0]['group_participants']; $new_message['to_uid_id'] = $va[0]['group_participants']; foreach ($arrVa as $key => $value) { if ($value == $uid) { unset($arrVa[$key]); } } $to_uid = $arrVa; } if ($message_data['mes_types'] == 'image') { $pa = $message_content; if (preg_match("/^(data:\\s*image\\/(\\w+);base64,)/", $pa, $result)) { $type = $result[2]; //创建文件夹 $save_path = "../chatImage/" . $message_data['to_uid_id'] . "/"; $save_url = "/chat/chatImage/" . $message_data['to_uid_id'] . "/"; if (!file_exists($save_path)) { mkdir($save_path); } //新文件名 $new_file_name = date("YmdHis") . rand(1000, 9999) . '.' . $type; if (file_put_contents($save_path . $new_file_name, base64_decode(str_replace($result[1], '', $pa)))) { $message_content = "<img src='" . $save_url . $new_file_name . "' class='send-img'>"; $new_message['content'] = $message_content; } else { return; } } } $new_message['image'] = $message_data['mes_types']; $insert_id = $db1->insert('oms_string_message')->cols(array('room_id' => $room_id, 'sender_id' => $uid, 'accept_id' => $message_data['to_uid_id'], 'sender_name' => $client_name, 'accept_name' => $message_data['accept_name'], 'message_type' => $message_data['message_type'], 'mesages_types' => $message_data['mes_types'], 'groupId' => $message_data['groupId'], 'message_content' => $message_content, 'session_no' => $session_no, 'create_time' => time(), 'update_time' => time()))->query(); $new_message['insert_id'] = $insert_id; $new_message['session_no'] = $session_no; $new_message['header_img_url'] = $_SESSION['header_img_url']; if ($message_data['message_type'] == "groupMessage") { $db1->query("UPDATE `oms_groups_people` SET `mes_state`=1, `mes_num`=`mes_num`+1, `mes_id`=" . $insert_id . " WHERE `staffid` != {$uid} AND `pid`=" . $message_data['session_no']); } else { if ($message_data['message_type'] == "message") { $chat_res = $db1->single('SELECT `id` FROM `oms_chat_message_ist` WHERE `pid`=' . $message_data['to_uid_id']); if (!empty($chat_res)) { $db1->query("UPDATE `oms_chat_message_ist` SET `mes_num` = `mes_num`+1, `mes_id`={$insert_id} WHERE id=" . $chat_res); $insert_id = $chat_res; } else { $insert_id = $db1->insert('oms_chat_message_ist')->cols(array('pid' => $message_data['to_uid_id'], 'session_no' => $session_no, 'mes_id' => $insert_id, 'oms_id' => $room_id))->query(); } } } // $new_message['insert_id'] = $insert_id; Gateway::sendToUid($to_uid, json_encode($new_message)); return; } // 组聊 $new_message = array('type' => 'say_uid', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => 'all', 'content' => "{$client_name}说: " . nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); $insert_id = $db1->insert('oms_string_message')->cols(array('room_id' => $room_id, 'sender_id' => $message_data['senderid'], 'accept_id' => 0, 'accept_name' => $client_name, 'message_type' => $message_data['message_type'], 'message_content' => nl2br(htmlspecialchars($message_data['content'])), 'create_time' => time(), 'update_time' => time()))->query(); return Gateway::sendToGroup($room_id, json_encode($new_message)); //数据操作消息的关闭 //数据操作消息的关闭 case 'mes_close': $db1 = Db::instance('oms'); // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $session_no = $message_data['session_no']; $uid = $_SESSION['uid']; if ($message_data['mestype'] == 'message') { $db1->query("DELETE FROM `oms_chat_message_ist` WHERE `session_no`= '" . $session_no . "'"); } else { $db1->query("UPDATE `oms_groups_people` SET `mes_state`=0, `mes_num`=0 WHERE `staffid` = {$uid} AND `pid`='" . $session_no . "'"); } return; // 选择人后聊天信息 // 选择人后聊天信息 case 'mes_chat': $db1 = Db::instance('oms'); // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $uid = $_SESSION['uid']; $session_no = $uid < $message_data['mes_para'] ? $uid . "-" . $message_data['mes_para'] : $message_data['mes_para'] . "-" . $uid; $mes_list = $db1->query("SELECT a.`id`, a.`message_content`, a.`mesages_types`, a.`create_time`, a.`sender_name`, a.`sender_id`, b.`card_image` FROM `oms_string_message` a LEFT JOIN `oms_hr` b ON a.`sender_id` = b.staffid WHERE a.`delState` = 0 AND a.`session_no`= " . "'{$session_no}' ORDER BY create_time desc limit 0, 10"); if (!empty($mes_list)) { foreach ($mes_list as $key => $value) { $mes_list[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']); } } $mes_list['type'] = 'mes_chat'; Gateway::sendToClient($client_id, json_encode($mes_list)); return; //滚动消息的分页 //滚动消息的分页 case 'mes_load': $db1 = Db::instance('oms'); // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $uid = $_SESSION['uid']; if ($message_data['message_type'] == "message") { //会话id $session_no = $uid > $message_data['to_uid'] ? $message_data['to_uid'] . "-" . $uid : $uid . "-" . $message_data['to_uid']; } else { //验证是否在群聊 $va = $db1->query("SELECT `group_participants` FROM `oms_group_chat` WHERE `id`=" . $message_data['session_no']); if (empty($va)) { $onlode['type'] = 'onlode'; $onlode['save'] = 0; Gateway::sendToClient($client_id, json_encode($onlode)); return; } $arrVa = explode(',', $va[0]['group_participants']); if (!in_array($uid, $arrVa)) { return; } //会话id $session_no = $message_data['session_no']; } if (!empty($message_data['mes_loadnum'])) { $onlode = $db1->query("SELECT a.`id`, a.`message_content`, a.`mesages_types`, a.`create_time`, a.`accept_name`, a.`sender_id`, a.`sender_name`,b.`card_image` FROM `oms_string_message` a LEFT JOIN `oms_hr` b ON a.`sender_id`=b.`staffid` WHERE a.`delState` = 0 AND a.`session_no`= " . "'{$session_no}' ORDER BY a.create_time desc limit " . $message_data['mes_loadnum'] . ", 10"); if (!empty($onlode)) { foreach ($onlode as $key => $value) { $onlode[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']); } $onlode['type'] = 'onlode'; $onlode['save'] = 1; } else { $onlode['type'] = 'onlode'; $onlode['save'] = 0; } Gateway::sendToClient($client_id, json_encode($onlode)); } return; //群聊 //群聊 case 'mes_groupChat': $db1 = Db::instance('oms'); // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $uid = $_SESSION['uid']; // $arrYanzhng = explode(',', $message_data['groupvalue']); // if (!in_array($uid, $arrYanzhng)) { // return ; // } $group_mes_list = $db1->query("SELECT a.`id`, a.`message_content`, a.`mesages_types`, a.`create_time`, a.`sender_name`, a.`sender_id`,a.`session_no`, b.`card_image` FROM `oms_string_message` a LEFT JOIN `oms_hr` b ON a.`sender_id`= b.staffid WHERE a.`delState` = 0 AND a.`session_no`= '" . $message_data['session_no'] . "' ORDER BY a.create_time desc limit 0, 10"); if (empty($group_mes_list)) { return; } $yanzheng = $db1->select('group_participants')->from('oms_group_chat')->where('id= :id')->bindValues(array('id' => $group_mes_list[0]['session_no']))->row(); if (!in_array($uid, explode(',', $yanzheng['group_participants']))) { Gateway::sendToClient($client_id, json_encode(array('type' => 'mes_chat'))); return; } if (!empty($group_mes_list)) { foreach ($group_mes_list as $key => $value) { $group_mes_list[$key]['create_time'] = date('Y-m-d H:i:s', $value['create_time']); } } $group_mes_list['type'] = 'mes_chat'; Gateway::sendToClient($client_id, json_encode($group_mes_list)); return; //最近联系人 //最近联系人 case 'recentcClose': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; $db1->query("UPDATE `oms_string_message` SET `delState` = 1 WHERE `session_no` = '" . $message_data['session'] . "'"); return; //增加群聊人 //增加群聊人 case 'addGroupMan': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; $arrAddGroupMan = $db1->query("SELECT `group_participants`,`group_name` FROM `oms_group_chat` WHERE id=" . $message_data['session_no']); $arr = explode(",", $arrAddGroupMan[0]['group_participants']); if (!in_array($uid, $arr)) { return; } foreach ($message_data['sidList'] as $key => $value) { if (!in_array($value, $arr)) { $arr[] = $value; $addMan[] = $value; } } $sAddGroupMan = implode(",", $arr); foreach ($addMan as $k => $val) { $arrvalue[] = "('" . $message_data['session_no'] . "', '" . $val . "', '" . $arrAddGroupMan[0]['group_name'] . "', " . time() . " ," . time() . ")"; } $strvalue = implode(",", $arrvalue); $db1->query("INSERT INTO `oms_groups_people` (`pid`, `staffid`, `group_name`, `create_time`, `update_time`) value" . $strvalue); $db1->query("UPDATE `oms_group_chat` SET `group_participants`='" . $sAddGroupMan . "' WHERE id=" . $message_data['session_no']); $db1->query("UPDATE `oms_groups_people` SET `all_staffid`='" . $sAddGroupMan . "' WHERE `pid`=" . $message_data['session_no']); return; //删除群聊里的人 //删除群聊里的人 case 'delgroupman': $uid = $_SESSION['uid']; $id = $message_data['id']; $groupid = $message_data['groupid']; $db1 = Db::instance('oms'); $arrgrouppeople = $db1->select('*')->from('oms_group_chat')->where('id= :id')->bindValues(array('id' => $groupid))->row(); // $arrgrouppeople = $db1->row("SELECT * FROM `oms_groups_people` WHERE `id`=".$uid); $arrjoinGroup = explode(',', $arrgrouppeople['group_participants']); if ($uid == $arrgrouppeople['group_founder']) { foreach ($arrjoinGroup as $key => $value) { if ($value == $id) { unset($arrjoinGroup[$key]); break; } } $unarrjoinGroup = $arrjoinGroup; $unstrgroupman = implode(",", $unarrjoinGroup); $db1->query("UPDATE `oms_groups_people` SET `all_staffid`= '" . $unstrgroupman . "' WHERE `pid`=" . $arrgrouppeople['id']); $db1->query("DELETE FROM `oms_groups_people` WHERE `staffid`= {$id} AND `pid`=" . $arrgrouppeople['id']); $db1->query("UPDATE `oms_group_chat` SET `group_participants`= '" . $unstrgroupman . "' WHERE `id`=" . $arrgrouppeople['id']); } return; case 'dissolve_group': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; $groupId = $message_data['groupId']; $dissolve_group = $db1->select('*')->from('oms_group_chat')->where('id= :id')->bindValues(array('id' => $groupId))->row(); if ($uid == $dissolve_group['group_founder']) { $row_count = $db1->delete('oms_group_chat')->where('id=' . $groupId)->query(); $row_count = $db1->delete('oms_groups_people')->where('pid=' . $groupId)->query(); } break; //增加最近联系人 //增加最近联系人 case 'addContact': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; if ($message_data['mestype'] == "message") { $mes_id = $message_data['mes_id']; } else { $mes_id = $message_data['session_no']; } $conNum = $db1->column('SELECT id FROM `oms_nearest_contact` WHERE `session_no`=' . $message_data['session_no']); if ($message_data['mestype'] == "message") { $insert_id = $db1->insert('oms_nearest_contact')->cols(array('pid' => $uid, 'mestype' => $message_data['mestype'], 'session_no' => $message_data['session_no'], 'sender_name' => $message_data['sender_name'], 'accept_name' => $message_data['accept_name'], 'mes_id' => $mes_id, 'contacts_name' => $message_data['accept_name'], 'to_uid_header_img' => $message_data['to_uid_header_img'], 'timeStamp' => time()))->query(); // $insert_id = $db1->insert('oms_nearest_contact')->cols(array('pid'=>$mes_id, 'mestype'=>$message_data['mestype'],'session_no'=>$message_data['session_no'], 'sender_name'=>$message_data['sender_name'], 'accept_name'=>$message_data['accept_name'], 'contacts_name'=>$message_data['sender_name'], 'mes_id'=>$uid, 'to_uid_header_img'=>$message_data['to_uid_header_img'], 'timeStamp'=>time()))->query(); } else { $db1->query('UPDATE `oms_groups_people` SET `contacts_id`=0 WHERE `pid`=' . $message_data['session_no'] . ' AND `staffid`=' . $uid); if (count($conNum) != 0) { return; } $insert_id = $db1->insert('oms_nearest_contact')->cols(array('mestype' => $message_data['mestype'], 'session_no' => $message_data['session_no'], 'sender_name' => $message_data['sender_name'], 'accept_name' => $message_data['accept_name'], 'mes_id' => $mes_id, 'to_uid_header_img' => $message_data['to_uid_header_img'], 'timeStamp' => time()))->query(); } break; //删除最近联系人 //删除最近联系人 case 'delContact': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; echo $message_data['mestype']; if ($message_data['mestype'] != 'message') { $db1->query('UPDATE `oms_groups_people` SET `contacts_id`=1 WHERE `staffid`=' . $uid . ' AND `pid`="' . $message_data['session_no'] . '"'); } else { $db1->query('DELETE FROM `oms_nearest_contact` WHERE `id`="' . $message_data['id'] . '"'); } break; //更新联系人 //更新联系人 case 'updContact': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; $db1->query('UPDATE `oms_nearest_contact` SET `timeStamp`=' . time() . ' WHERE `session_no`=' . $message_data['session_no']); break; //群聊人显示 //群聊人显示 case 'groupManShow': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; $groupShowManId = $message_data['session_no']; $arrGroupMan = $db1->query('SELECT a.*,b.`group_founder`,c.name,c.card_image FROM `oms_groups_people` a LEFT join `oms_group_chat` b ON a.`pid` = b.`id` LEFT join `oms_hr` c ON a.`staffid` = c.`staffid` WHERE a.`state` = 0 AND a.`pid`=' . $groupShowManId); $arrGroupMan['type'] = 'showGroupMan'; Gateway::sendToClient($client_id, json_encode($arrGroupMan)); break; case 'customer': $db1 = Db::instance('oms'); $uid = $_SESSION['uid']; return; case 'allOnlineNum': $uid = $_SESSION['uid']; // echo $adminUid; if ($uid == $adminUid) { //防止别人冒充 $arrALlonlineMan = []; $allClients_list = Gateway::getALLClientInfo(); foreach ($allClients_list as $key => $value) { if (in_array($value['uid'], $arrALlonlineMan)) { unset($allClients_list[$key]); } else { $arrALlonlineMan[] = $value['uid']; } } $allOnlineNum = count($allClients_list); $new_allOnlineNum['type'] = 'allOnlineNum'; $new_allOnlineNum['allOnlineNum'] = $allOnlineNum; Gateway::sendToCurrentClient(json_encode($new_allOnlineNum)); } return; case 'active': // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; // 私聊 if ($message_data['to_uid_id'] != 'all') { $new_message = array('type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => $message_data['to_client_id'], 'content' => "<b>对你说: </b>" . nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message)); $new_message['content'] = "<b>你对" . htmlspecialchars($message_data['to_client_name']) . "说: </b>" . nl2br(htmlspecialchars($message_data['content'])); return Gateway::sendToCurrentClient(json_encode($new_message)); } $new_message = array('type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => 'all', 'content' => nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); return Gateway::sendToGroup($room_id, json_encode($new_message)); } }
/** * 当客户端连上时触发 * @param int $client_id */ public static function onConnect($client_id) { $_SESSION['id'] = time(); Gateway::sendToCurrentClient('{"type":"welcome","id":' . $_SESSION['id'] . '}'); }
/** * 当客户端发来消息时触发 * @param int * @param string * @return void */ public static function onMessage($client_id, $message) { /** * 得到客户端的IP和端口号 * var_dump($_SERVER['REMOTE_ADDR'].':'.$_SERVER['REMOTE_PORT']); */ // // var_export(json_encode($message, JSON_UNESCAPED_UNICODE)); // // $data = json_encode($message, JSON_UNESCAPED_UNICODE); // // if( $fileType != 'UTF-8'){ // // $data = mb_convert_encoding($message['macid'] ,'utf-8' , $fileType); // // } // // var_export($data); // // var_export($message); $connectHC = Db::instance('ConnectHC'); // 没有登录 if (!isset($_SESSION['bind'])) { // 接收到的是JSON数据包 if (is_array($message)) { self::bindMacId($client_id, $message['macid']); return; } // 回复心跳包 Gateway::sendToCurrentClient(1); } else { var_dump($message); Gateway::sendToCurrentClient(1); if (is_array($message)) { // 更新蓝牙连接标志 if (isset($message['sign'])) { $sign = $message['sign']; $data = $connectHC->query("UPDATE `WEBHC` SET `sign` = {$sign} WHERE clientid={$client_id}"); Gateway::sendToCurrentClient(self::SUCCESS_SET_SIGN); return; } // 更新CLIENTID if (isset($message['macid'])) { self::bindMacId($client_id, $message['macid']); return; } // 更新APP键名 $param = $connectHC->row("SELECT `param` FROM `WEBHC` WHERE clientid={$client_id}"); $parambefore = explode('/', $param['param']); foreach ($message as $key => $value) { $parambefore[$key - 1] = $value; } $paramafter = implode('/', $parambefore); $connectHC->query("UPDATE `WEBHC` SET `param` = '{$paramafter}' WHERE clientid={$client_id}"); } else { // 回复心跳包 Gateway::sendToCurrentClient(1); } } }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $data) { $class_dir = __DIR__ . "/Services"; //要读取的类文件路径 $host_type = "internet"; //客户端类型 echo $_SERVER['REMOTE_ADDR'] . "\n"; if ($_SERVER['REMOTE_ADDR'] == "127.0.0.1") { echo "内网登陆"; $class_dir = __DIR__ . "/SysServices"; $host_type = "localhost"; //客户端类型 } echo $_SESSION['UID'] . "\n"; $statistic_address = 'udp://127.0.0.1:55656'; // 判断数据是否正确 if (empty($data['class']) || empty($data['method']) || !isset($data['param_array'])) { // 发送数据给客户端,请求包错误 if ($host_type == "internet" && empty($_SESSION['UID'])) { $ret = Gateway::sendToCurrentClient(array('stat' => 100, 'text' => 'no login', 'data' => null)); Gateway::closeCurrentClient(); } else { $ret = Gateway::sendToCurrentClient(array('stat' => 400, 'text' => 'bad request', 'data' => null)); } return $ret; } // 获得要调用的类、方法、及参数 $class = $data['class']; $method = $data['method']; $param_array = $data['param_array']; //所有的调用一定要在登录后才可以 if (!empty($_SESSION['UID']) || $class == "Device" && $method == "Login" || $host_type == "localhost") { StatisticClient::tick($class, $method); $success = false; // 判断类对应文件是否载入 if (!class_exists($class)) { $include_file = $class_dir . "/{$class}.php"; if (is_file($include_file)) { require_once $include_file; } if (!class_exists($class)) { $code = 404; $msg = "class {$class} not found"; StatisticClient::report($class, $method, $success, $code, $msg, $statistic_address); // 发送数据给客户端 类不存在 //var_dump($connection); return Gateway::sendToCurrentClient(array('stat' => $code, 'text' => $msg, 'data' => null)); } } // 调用类的方法 try { $ret = call_user_func_array(array($class, $method), array($client_id, $param_array)); StatisticClient::report($class, $method, 1, 0, '', $statistic_address); // 发送数据给客户端,调用成功,data下标对应的元素即为调用结果 return Gateway::sendToCurrentClient(array('stat' => 0, 'text' => 'ok', 'data' => $ret)); } catch (Exception $e) { // 发送数据给客户端,发生异常,调用失败 $code = $e->getCode() ? $e->getCode() : 500; StatisticClient::report($class, $method, $success, $code, $e, $statistic_address); return Gateway::sendToCurrentClient(array('stat' => $code, 'text' => $e->getMessage(), 'data' => $e)); } } else { $ret = Gateway::sendToCurrentClient(array('stat' => 400, 'text' => 'no login', 'data' => null)); Gateway::closeCurrentClient(); return $ret; } }
/** * 向当前连接用户发送数据包 * @param string $type 消息类型 * @param mixed $result 消息数据 * @param int $status 数据状态 * @param string $msg 数据描述消息 * @return bool */ protected static function sendDataToCurrentClient($type, $result = null, $status = 0, $msg = '') { $data = json_encode(array('type' => $type, 'result' => $result, 'status' => $status, 'msg' => $msg)); return Gateway::sendToCurrentClient($data); }
/** * 有消息时 * @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; } }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $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数据 $message_data = json_decode($message, true); if (!$message_data) { return; } // 根据类型执行不同的业务 switch ($message_data['type']) { // 客户端回应服务端的心跳 case 'pong': return; // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 // 客户端登录 message格式: {type:login, name:xx, room_id:1} ,添加到客户端,广播给所有客户端xx进入聊天室 case 'login': // 判断是否有房间号 if (!isset($message_data['room_id'])) { throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:{$message}"); } $uid = $message_data['uid']; $room_id = $message_data['room_id']; $_SESSION['room_id'] = $room_id; //从缓存服务器中取出当前登陆用户的信息 $memcache = new Memcache(); $userInfo = $memcache->getUserInfo($uid); $_SESSION['userInfo'] = $userInfo; $_SESSION['client_name'] = $userInfo['nick_name'] ? $userInfo['nick_name'] : $userInfo['username']; // 获取房间内所有用户列表 $clients_list = Gateway::getClientInfoByGroup($room_id); foreach ($clients_list as $tmp_client_id => $item) { $clients_list[$tmp_client_id] = ['uid' => $item['userInfo']['id'], 'client_name' => $item['userInfo']['nick_name'] ? $item['userInfo']['nick_name'] : $item['userInfo']['username'], 'head_portrait' => $item['userInfo']['head_portrait']]; } $clients_list[$client_id] = ['uid' => $userInfo['id'], 'client_name' => $userInfo['nick_name'] ? $userInfo['nick_name'] : $userInfo['username'], 'head_portrait' => $userInfo['head_portrait']]; if (count(Gateway::getClientIdByUid($uid)) != 0) { // 用户已在房间内 $_SESSION['client_name'] = null; Gateway::sendToCurrentClient(json_encode(array('type' => 'exist'))); return; } // 转播给当前房间的所有客户端,xx进入聊天室 message {type:login, client_id:xx, name:xx} $new_message = array('type' => $message_data['type'], 'client_id' => $client_id, 'uid' => $uid, 'head_portrait' => $userInfo['head_portrait'], 'client_name' => $_SESSION['client_name'], 'time' => date('Y-m-d H:i:s')); Gateway::sendToGroup($room_id, json_encode($new_message)); Gateway::joinGroup($client_id, $room_id); Gateway::bindUid($client_id, $uid); // 给当前用户发送用户列表 $new_message['client_list'] = $clients_list; Gateway::sendToCurrentClient(json_encode($new_message)); return; // 客户端发言 message: {type:say, to_client_id:xx, content:xx} // 客户端发言 message: {type:say, to_client_id:xx, content:xx} case 'say': // 非法请求 if (!isset($_SESSION['room_id'])) { throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $room_id = $_SESSION['room_id']; $client_name = $_SESSION['client_name']; //从缓存服务器中取出用户信息 $memcache = new Memcache(); $userInfo = $memcache->getUserInfo($message_data['send_uid']); $client_head_portrait = $userInfo['head_portrait']; // 私聊 if ($message_data['to_client_id'] != 'all') { $new_message = array('send_uid' => $message_data['send_uid'], 'to_uid' => $message_data['to_uid'], 'head_portrait' => $client_head_portrait, 'type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => $message_data['to_client_id'], 'content' => "<b>对你说: </b>" . nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message)); $new_message['content'] = "<b>你对" . htmlspecialchars($message_data['to_client_name']) . "说@: </b>" . nl2br(htmlspecialchars($message_data['content'])); return Gateway::sendToCurrentClient(json_encode($new_message)); } $new_message = array('send_uid' => $message_data['send_uid'], 'head_portrait' => $client_head_portrait, 'type' => 'say', 'from_client_id' => $client_id, 'from_client_name' => $client_name, 'to_client_id' => 'all', 'content' => nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d H:i:s')); return Gateway::sendToGroup($room_id, json_encode($new_message)); } }
/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $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数据 $messageData = json_decode($message, true); if (!$messageData) { return; } // 根据类型执行不同的业务 switch ($messageData['type']) { // 客户端回应服务端的心跳 case 'pong': return; // 客户端登录 message格式: {type:login, clientName:xx} ,添加到客户端,广播给所有客户端xx上线 // 客户端登录 message格式: {type:login, clientName:xx} ,添加到客户端,广播给所有客户端xx上线 case 'login': // 判断是否有有名字 if (!isset($messageData['clientName'])) { throw new \Exception("\$messageData['clientName'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:{$message}"); } $clientName = htmlspecialchars(urldecode($messageData['clientName'])); //判断数据库中是否存在用户,不存在则关闭链接 if (!Muser::getUserinfo(array('accountid' => $clientName))) { //忽略的消息传给用户 Gateway::sendToCurrentClient(json_encode(array('type' => 'error', 'info' => 'erroruser', 'msg' => '用户名不存在'))); Gateway::closeClient($client_id); return; } // 把用户名放到session中 $_SESSION['clientName'] = $clientName; //存储用户到在线列表 self::addUserToOnlineList($client_id, $clientName); //转播给在线客户,xx上线 message {type:login, client_id:xx, name:xx} $new_message = array('type' => $messageData['type'], 'clientName' => $clientName, 'time' => time()); Gateway::sendToAll(json_encode($new_message)); return; case 'say': // 非法请求 if (!isset($_SESSION['clientName'])) { throw new \Exception("\$_SESSION['clientName'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $clientName = $_SESSION['clientName']; $chatid = $messageData['chatid']; //获取群成员 $chatList = Muser::getChatListFromChatid($messageData['chatid']); if (!is_array($chatList)) { return; } //判断消息类型 $msgType = Storekey::CHAT_MSG_TYPE; $filemd5 = ''; if (isset($messageData['msgType'])) { if ($messageData['msgType'] === 'file') { $msgType = Storekey::ATTACH_MSG_TYPE; $filemd5 = $messageData['filemd5']; } elseif ($messageData['msgType'] === 'image') { $msgType = Storekey::IMAGE_MSG_TYPE; } } //所有单人聊天、群组聊天消息都压入redis队列中,以便存储 $pushArr = self::makeMsg($chatid, $clientName, $messageData['content'], $msgType, $filemd5); self::msgIntoQueue($pushArr); // 聊天内容 $new_message = self::makeMsg($chatid, $clientName, $messageData['content'], 'say'); $jsonNewMessage = json_encode($new_message); //获取所有存储的在线用户 $clientLists = Muser::getOnlineUsers(); //获取该组用户在线的clientid,并广播 $onlineClientIds = self::getClientidsFromUsers($clientLists, $chatList); if ($onlineClientIds) { Gateway::sendToAll($jsonNewMessage, $onlineClientIds); } //获取该组用户所有不在线的用户,并生成离线消息队列 $offlineUsers = self::getOfflineUsers($clientLists, $chatList); if ($offlineUsers) { foreach ($offlineUsers as $offname) { Mmessage::addUnreadMsg($offname, $chatid, Storekey::UNREAD_MSG); } } return; case 'broadcast': if (!isset($messageData['touser']['member'])) { return; } $toUsersList = $messageData['touser']['member']; if (!$toUsersList || !is_array($toUsersList)) { return; } $toUsersList = array_unique($toUsersList); // 非法请求 if (!isset($_SESSION['clientName'])) { throw new \Exception("\$_SESSION['clientName'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $clientName = $_SESSION['clientName']; //makeMsg($chatid, $from, $content='', $type=0) //所有广播消息压入redis队列中,以便存储 $messageData['title'] = isset($messageData['title']) ? $messageData['title'] : '无标题'; $pushArr = array('fromuser' => $clientName, 'touser' => '-' . implode('-', $messageData['touser']['member']) . '-', 'touserTitle' => $messageData['touser']['title'], 'title' => addslashes($messageData['title']), 'content' => addslashes($messageData['content']), 'time' => time(), 'type' => Storekey::BROADCAST_MSG_TYPE); self::msgIntoQueue($pushArr); // 聊天内容.修改type,前端发送不必发送所有用户 $pushArr['type'] = 'broadcast'; unset($pushArr['touser']); $jsonNewMessage = json_encode($pushArr); //获取所有存储的在线用户 $clientLists = Muser::getOnlineUsers(); //获取该组用户在线的clientid $onlineClientIds = self::getClientidsFromUsers($clientLists, $toUsersList); if ($onlineClientIds) { Gateway::sendToAll($jsonNewMessage, $onlineClientIds); } //获取该组用户所有不在线的用户 $offlineUsers = self::getOfflineUsers($clientLists, $toUsersList); if ($offlineUsers) { foreach ($offlineUsers as $offname) { Mbroadcast::addUnreadBroadcastNum($offname, Storekey::UNREAD_BROADCAST); } } return; case 'groupset': // 非法请求 if (!isset($_SESSION['clientName'])) { throw new \Exception("\$_SESSION['clientName'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $clientName = $_SESSION['clientName']; //修改群组成员 $chatInfo = explode('-', $messageData['chatid']); //master=$chatInfo[0],uuid=$chatInfo[1] //获取已有群成员信息 $originalMembers = \Api\Model\Mgroup::getGroupMembers(array('master' => $chatInfo[0], 'uuid' => $chatInfo[1])); $setRes = \Api\Model\Mgroup::setGroup(array('master' => $chatInfo[0], 'uuid' => $chatInfo[1], 'title' => $messageData['title'])); if (!$setRes) { return; } $messageData['members'] = array_unique($messageData['members']); //根据 $originalMembers 和 $messageData['members'] 获取分别要添加和减少的成员 $addMembers = array_diff($messageData['members'], $originalMembers); $delMembers = array_diff($originalMembers, $messageData['members']); if (!is_array($addMembers) || !is_array($delMembers) || !is_array($originalMembers)) { return; } //删除用户 \Api\Model\Mgroup::setGroupMembers(array('master' => $chatInfo[0], 'uuid' => $chatInfo[1], 'type' => 'del', 'userList' => $delMembers)); //把删除用户的该chatid的最近联系人删除 \Api\Model\Mgroup::remRecentMembers($messageData['chatid'], $delMembers); //添加用户 \Api\Model\Mgroup::setGroupMembers(array('master' => $chatInfo[0], 'uuid' => $chatInfo[1], 'type' => 'add', 'userList' => $addMembers)); //要广播的信息 $broadMsg = array('type' => $messageData['type'], 'chatid' => $messageData['chatid'], 'fromuser' => $clientName, 'delMember' => $delMembers, 'addMember' => $addMembers); //获取所有存储的在线的用户 $clientLists = Muser::getOnlineUsers(); //获取该组原本用户在线的clientid,并广播 if ($originalMembers) { $onlineClientIds = self::getClientidsFromUsers($clientLists, $originalMembers); } if (isset($onlineClientIds) && $onlineClientIds) { Gateway::sendToAll(json_encode($broadMsg), $onlineClientIds); } return; case 'systemNotice': // 非法请求 if (!isset($_SESSION['clientName'])) { throw new \Exception("\$_SESSION['clientName'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}"); } $clientName = $_SESSION['clientName']; //群组info $chatInfo = explode('-', $messageData['chatid']); //master=$chatInfo[0],uuid=$chatInfo[1] //获取已有群成员信息 $originalMembers = \Api\Model\Mgroup::getGroupMembers(array('master' => $chatInfo[0], 'uuid' => $chatInfo[1])); //如果本身不在群里则禁止操作 if (!in_array($clientName, $originalMembers)) { return; } //要广播的信息 $broadMsg = array('fromuser' => $clientName, 'type' => $messageData['type'], 'chatid' => $messageData['chatid'], 'action' => $messageData['action']); switch ($messageData['action']) { case "grouptitle": //修改群title $setRes = \Api\Model\Mgroup::setGroup(array('master' => $chatInfo[0], 'uuid' => $chatInfo[1], 'title' => $messageData['title'])); $broadMsg['title'] = $messageData['title']; if (!$setRes) { return; } break; case "opennotice": //打开群消息提醒 break; case "grouptitle": //屏蔽群消息提醒 break; } //获取所有存储的在线的用户 $clientLists = Muser::getOnlineUsers(); //获取该组原本用户在线的clientid,并广播 if ($originalMembers) { $onlineClientIds = self::getClientidsFromUsers($clientLists, $originalMembers); } if (isset($onlineClientIds) && $onlineClientIds) { Gateway::sendToAll(json_encode($broadMsg), $onlineClientIds); } return; } }
public static function onMessage($client_id, $message) { // var_dump(self::get_cpufree()); Gateway::sendToCurrentClient($message); }
/** * 当客户端发来消息时触发 * @param int $client_id * @param string $message * @return void */ public static function onMessage($client_id, $message) { // 得到协议版本 $wifiversion = substr($message, 4, 2); // 得到消息中的目的源地址 $targetaddr = substr($message, 8, 12); // 得到消息中的数据源地址 $startaddr = substr($message, 20, 12); // 得到数据类型 $messageClass = substr($message, 33, 1); // 得到心跳包类型 $onlinedata = substr($message, 35, 1); // var_dump($client_id.'--0--'.bin2hex($message)); // 判断心跳包 if ($onlinedata === "�" && isset($_SESSION['registflag'])) { // 收到心跳包重新定时 self::updateTimeid($client_id); return; } // 注册成功返回信息 && 发送失败返回信息 if (!isset($_SESSION["registsuccess"]) && !isset($_SESSION["transerror"])) { $_SESSION["registsuccess"] = "++HC*" . $startaddr . Protocol::$V1['DEFALUT_SMAC'] . Protocol::$V1['SERVER_MODEL'] . "" . Protocol::$V1['STATUS_CONNECTED'] . "�HC\r\n"; $_SESSION["transerror"] = "++HC*" . $startaddr . Protocol::$V1['DEFALUT_SMAC'] . Protocol::$V1['SERVER_MODEL'] . "" . Protocol::$V1['STATUS_DISONLINE'] . "�HC\r\n"; } // 客户端之间通讯 if ($wifiversion === "" && $targetaddr !== Protocol::$V1['DEFALUT_SMAC']) { // 判断$_SESSION缓存中客户端client_id是否在线 if (isset($_SESSION["{$targetaddr}"]) && Gateway::isOnline($_SESSION["{$targetaddr}"])) { // if($messageClass === "\x02"){ // // 记录控制次数 // self::$connectHC->query("UPDATE `HC` SET `control` = `control`+1 WHERE macid='$startaddr'"); // } // var_dump($_SESSION["$targetaddr"].'--1--'.bin2hex($message)); Gateway::sendToClient($_SESSION["{$targetaddr}"], $message); return; } // 得到目的客户端client_id $targetaddrclientid = self::$connectHC->single("SELECT clientid FROM `HC` WHERE macid='{$targetaddr}'"); // 如果目的客户端在线则转发 if (Gateway::isOnline($targetaddrclientid)) { // 写入$_SESSION缓存 $_SESSION["{$targetaddr}"] = intval($targetaddrclientid); // if($messageClass === "\x02"){ // // 记录控制次数 // self::$connectHC->query("UPDATE `HC` SET `control` = `control`+1 WHERE macid='$startaddr'"); // } // var_dump($_SESSION["$targetaddr"].'--'.bin2hex($message)); Gateway::sendToClient($targetaddrclientid, $message); return; } // 目的客户端不在线则回复 Gateway::sendToCurrentClient($_SESSION["transerror"]); return; } // 客户端注册 if ($targetaddr === Protocol::$V1['DEFALUT_SMAC']) { // 重复注册 if (isset($_SESSION['registflag']) && $_SESSION['registflag'] === 1) { // 心跳包更新 self::updateTimeid($client_id); // 注册成功 Gateway::sendToCurrentClient($_SESSION["registsuccess"]); return; } // 判断客户端是否存在 $selectclientid = self::$connectHC->single("SELECT clientid FROM `HC` WHERE macid='{$startaddr}'"); if ($selectclientid === "0") { // 更新MYSQL数据库 self::$connectHC->query("UPDATE `HC` SET `clientid` = {$client_id}, `lastintime` = CURRENT_TIMESTAMP() WHERE macid='{$startaddr}'"); $_SESSION['registflag'] = 1; // 心跳包更新 self::updateTimeid($client_id); // 注册成功 Gateway::sendToCurrentClient($_SESSION["registsuccess"]); return; } if ($selectclientid === false) { // 插入MYSQL数据库 self::$connectHC->query("INSERT INTO `HC` ( `macid`,`clientid`,`lastintime`) VALUES ('{$startaddr}', '{$client_id}',CURRENT_TIMESTAMP())"); $_SESSION['registflag'] = 1; // 心跳包更新 self::updateTimeid($client_id); // 注册成功 Gateway::sendToCurrentClient($_SESSION["registsuccess"]); return; } // 更新MYSQL数据库 self::$connectHC->query("UPDATE `HC` SET `clientid` = {$client_id}, `lastintime` = CURRENT_TIMESTAMP() WHERE macid='{$startaddr}'"); $_SESSION['registflag'] = 1; // 心跳包更新 self::updateTimeid($client_id); // 注册成功 Gateway::sendToCurrentClient($_SESSION["registsuccess"]); return; } }
/** * 当客户端连上时触发 * @param int $client_id */ public static function onConnect($client_id) { Gateway::sendToCurrentClient('{"type":"welcome","id":' . $client_id . '}'); }