From 0247c8d713df1bfd9680c97f18cf9979a1f72609 Mon Sep 17 00:00:00 2001 From: u2nyakim Date: Fri, 29 Aug 2025 18:00:17 +0800 Subject: [PATCH] =?UTF-8?q?up.=20=E6=B7=BB=E5=8A=A0gateway=20event?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/event/AdminGatewayEvents.php | 196 ++++++++++++++----------------- 1 file changed, 87 insertions(+), 109 deletions(-) diff --git a/app/event/AdminGatewayEvents.php b/app/event/AdminGatewayEvents.php index 6cd9afe..a5d8f3d 100644 --- a/app/event/AdminGatewayEvents.php +++ b/app/event/AdminGatewayEvents.php @@ -1,19 +1,6 @@ - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - /** * 用于检测业务代码死循环或者长时间阻塞等问题 * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload @@ -25,120 +12,111 @@ namespace app\event; * 聊天主逻辑 * 主要是处理 onMessage onClose */ + use \GatewayWorker\Lib\Gateway; class AdminGatewayEvents { - - /** - * 有消息时 - * @param int $client_id - * @param mixed $message - */ - public static function onMessage($client_id, $message) + public static function onMessage(int $client_id, string $message):void { - // 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"; - + var_dump($message); // 客户端传递的是json数据 $message_data = json_decode($message, true); - if(!$message_data) - { - return ; + if (!$message_data) { + return; } + $message_data = array_merge([ + 'type' => '', + 'event'=> '', + ], $message_data); + // 根据类型执行不同的业务 - switch($message_data['type']) - { + switch ($message_data['type']) { // 客户端回应服务端的心跳 case 'pong': return; - // 客户端登录 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"); + case 'system': + switch ($message_data['event']) { + // 客户端登录 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::getClientSessionsByGroup($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} + 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' => "对你说: " . 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'] = "你对" . htmlspecialchars($message_data['to_client_name']) . "说: " . nl2br(htmlspecialchars($message_data['content'])); + Gateway::sendToCurrentClient(json_encode($new_message)); + return; + } + + $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'), + ); + Gateway::sendToGroup($room_id, json_encode($new_message)); + return; } - - // 把房间号昵称放到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::getClientSessionsByGroup($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} - 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'=>"对你说: ".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'] = "你对".htmlspecialchars($message_data['to_client_name'])."说: ".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 integer $client_id 客户端id - */ - public static function onClose($client_id) + public static function onClose(int $client_id) { - // debug - echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id onClose:''\n"; - - // 从房间的客户端列表中删除 - if(isset($_SESSION['room_id'])) - { - $room_id = $_SESSION['room_id']; - $new_message = array('type'=>'logout', 'from_client_id'=>$client_id, 'from_client_name'=>$_SESSION['client_name'], 'time'=>date('Y-m-d H:i:s')); - Gateway::sendToGroup($room_id, json_encode($new_message)); - } + var_dump(['client_id' => $client_id, 'r'=>'CLOSET']); +// // 从房间的客户端列表中删除 +// if (isset($_SESSION['room_id'])) { +// $room_id = $_SESSION['room_id']; +// $new_message = array('type' => 'logout', 'from_client_id' => $client_id, 'from_client_name' => $_SESSION['client_name'], 'time' => date('Y-m-d H:i:s')); +// Gateway::sendToGroup($room_id, json_encode($new_message)); +// } } }