/** * 有消息时 * @param int $client_id * @param string $message */ public static function onMessage($client_id, $message) { // 如果是websocket握手 if (self::checkHandshake($message)) { $new_message = '{"type":"welcome","id":' . $client_id . '}'; // 发送数据包到客户端 return GateWay::sendToCurrentClient(WebSocket::encode($new_message)); return; } // websocket 通知连接即将关闭 if (WebSocket::isClosePacket($message)) { Gateway::kickClient($client_id, ''); self::onClose($client_id); return; } // 获取客户端原始请求 $message = WebSocket::decode($message); $message_data = json_decode($message, true); if (!$message_data) { return; } switch ($message_data['type']) { // 更新用户 case 'update': // 转播给所有用户 Gateway::sendToAll(WebSocket::encode(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(WebSocket::encode(json_encode($new_message))); } }
/** * 有消息时 * @param int $uid * @param string $message */ public static function onMessage($uid, $message) { // $message len < 7 可能是ping包,断开连接的包等暂时忽略 if (strlen($message) < 7) { return; } $message = WebSocket::decode($message); // 广播路线 Gateway::sendToAll(WebSocket::encode(pack('CVVVC', 2, 1, 1, $uid, 0) . substr($message, 1))); }
/** * 有消息时 * @param int $uid * @param string $message */ public static function onMessage($uid, $message) { if (WebSocket::isClosePacket($message)) { Gateway::kickUid($uid, ''); self::onClose($uid); return; } $message = WebSocket::decode($message); // debug echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} socketid:{$_SERVER['GATEWAY_SOCKET_ID']} uid:{$uid} onMessage:" . $message . "\n"; $message_data = json_decode($message, true); if (!$message_data) { return; } switch ($message_data['type']) { // 用户登录 message格式: {type:login, name:xx} ,添加到用户,广播给所有用户xx进入聊天室 case 'login': // 存储当前用户到用户列表 self::addUserToList($uid, htmlspecialchars($message_data['name'])); // 获取用户列表 $user_list = self::getUserList(); // 整理用户列表以便显示 $all_users = array(); if ($user_list) { foreach ($user_list as $tmp_uid => $name) { $all_users[] = array('uid' => $tmp_uid, 'name' => $name); } } // 发送给当前用户 内容是用户列表 message: {type:user_list, user_list:xxxx} Gateway::sendToUid($uid, WebSocket::encode(json_encode(array('type' => 'user_list', 'user_list' => $all_users)))); // 转播给所有用户,xx进入聊天室 message {type:login, uid:xx, name:xx} Gateway::sendToAll(WebSocket::encode(json_encode(array('type' => 'login', 'uid' => $uid, 'name' => htmlspecialchars($message_data['name']), 'time' => date('Y-m-d H:i:s'))))); return; // 用户发言 message: {type:say, to_uid:xx, content:xx} // 用户发言 message: {type:say, to_uid:xx, content:xx} case 'say': // 私聊 if ($message_data['to_uid'] != 'all') { $new_message = array('type' => 'say', 'from_uid' => $uid, 'to_uid' => $message_data['to_uid'], 'content' => nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d :i:s')); echo 'here'; return Gateway::sendToUid($message_data['to_uid'], WebSocket::encode(json_encode($new_message))); } // 向大家说 $new_message = array('type' => 'say', 'from_uid' => $uid, 'to_uid' => 'all', 'content' => nl2br(htmlspecialchars($message_data['content'])), 'time' => date('Y-m-d :i:s')); return Gateway::sendToAll(WebSocket::encode(json_encode($new_message))); } }