ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Oracle 21c Windows客户端安装与连接配置完全指南

Oracle 21c Windows客户端安装与连接配置完全指南 简介一份 Oracle Database 21c 客户端Windows 32 位正式安装包面向需要在 32 位 Windows 环境中连接与管理 Oracle 21c 数据库的数据库管理员、开发人员和测试人员覆盖本地开发、远程访问与企业部署等场景既适合有数据库基础的用户快速上手也可作为入门者理解客户端组件结构的参考。压缩包约 868.47MB内含 1403 个文件主要类型包括 jar、xml、dll、exe其中 jar 为 Java 组件库xml 承担配置与元数据描述dll 提供底层链接支持exe 则包含安装与运行工具另附 md、txt 文档以及 bat、sh 等辅助脚本便于理解安装过程与自定义配置。资源包目录结构完整安装引导、环境校验、语言支持与安全证书模块一应俱全内部脚本可辅助完成驱动检查、任务执行、组件添加与移除等操作支持自定义安装与排错帮助读者顺利搭建可用的 Oracle 21c 客户端环境。已有 205 人学习适合正在部署 Oracle 客户端或希望系统了解其组件构成、安装逻辑与运维细节的用户。1. Oracle Database 21c 客户端 NT_213000_client.zip装上它才能把 Windows 桌面机和远端库连起来我第一次拿到 NT_213000_client.zip 时也以为它只是“解压后装一下就行”的普通压缩包结果发现里面除了 setup.exe还躺着一整套 OUI 安装引擎的骨架文件。这个包是 Oracle Database 21c 面向 Windows 的 32 位客户端安装介质装上之后不需要本地数据库实例就能通过 sqlplus、ODBC 或 OCI 去连接远端的 Oracle 21c 数据库。它解决的本质问题是桌面端与生产库之间那条连接链路能不能被稳定、干净地建立起来。无论你是开发想连测试库跑 SQLDBA 要在 Windows 上执行巡检脚本还是运维要把工具链从 19c 升级到 21c这三个场景都会和这个 zip 打交道。很多人会先入为主地以为客户端就是把文件复制过去真正动手做静默安装的时候才发现它有一套独立的预检、响应文件和批处理体系。下文我会把这个包拆开里面哪些文件有用、怎么装、怎么配、最容易在哪儿翻车最后给一个能直接用的连接验证脚本。2. 解剖 NT_213000_client.zip介质里这堆文件不是摆设2.1 这个 zip 不是普通压缩包而是 OUI 分发介质的骨架Oracle 在 Windows 上发布客户端极少给一个绿色免安装目录而是用 Oracle Universal InstallerOUI的介质格式打包。NT_213000_client.zip 解压后你会看到 setup.exe、install 目录、response 目录以及一批 .bat 批处理脚本。安装过程真正动起来不是简单地复制文件到目标目录而是由 OUI 引擎先做环境预检再执行组件安装最后跑配置脚本。所以我在处理这个包时从不会盲目双击 setup.exe。第一步是确认安装账号有管理员权限第二步是把 zip 完整展开到纯英文路径下。很多人在这两步翻车装到一半提示权限不足或者路径带中文导致 JVM 字体配置花掉。另外OUI 在安装时会调用一批内部脚本这些脚本不会在前台显示出明细只有在排查安装日志时才会见到它们。下面这一组文件就是我在日志和介质目录里反复看到的角色。2.2 十个包内文件逐个拆解用途和踩坑点文件名实际用途你什么时候会关心它jmxremote.accessJDK/JRE 里控制 JMX 远程连接权限的 ACL 文件安装预检阶段做 JMX 端口探测时用到cvuhelper.batCluster Verification Utility 的 Windows 入口辅助脚本装前环境检查失败时日志里会指名道姓提到它check_afd_drivers.bat检查本机是否缺 ASM Filter DriverAFD驱动如果目标机器要挂 Oracle ASM缺驱动会告警exectask.bat供 OUI 以独立任务方式调用子步骤的辅助脚本装到某一步卡住时用它定位是哪个子任务没跑完common_include.bat被其他脚本共同 include 的公共变量定义想改脚本日志级别或路径时可以翻它access_setup.bat安装后设置目录 ACL让普通账号能读取客户端产物普通用户连不上但管理员能连上时问题多半在 ACLremove_cvuresource_baseline.bat清理上次安装留下的 CVU 基线避免残留重装报“已有残留”时跑一遍它addLangs.bat追加语言支持的批处理需要补装中文组件时用fontconfig.bfcJVM 字体渲染配置安装界面乱码或图形向导花屏时先查它blacklist记录清理/升级时要排队的路径和文件杀软误删文件后安装异常时对照它核对丢失项这十个文件大部分时间不会直接和用户交互但它们决定了安装能不能一次走完。拿 cvuhelper.bat 来说OUI 在做内存、磁盘、网络校验时底层会拉起 CVU 的命令行工具如果 cvuauth 阶段没权限访问 Windows 的组策略日志里就会出现“无法获取有关 Windows NT 组/用户的信息”这类报错。这个问题我后面会单独写一条避坑记录。2.3 安装前置条件32 位客户端和 64 位系统之间的关系客户端虽然不装数据库实例但对系统资源、操作系统版本、网络通路都有硬性要求。以 21.3 这个版本来说Windows 上常见的支持面是 Windows Server 2012 R2 以上、Windows 10/1132 位客户端安装在 64 位系统上时实际以 WOW64 模式运行。很多刚接触 Oracle 的同学会问32 位客户端能不能连 64 位数据库答案是可以的。数据库位数限制在实例进程客户端通过 TCP 协议和服务器端进程通信理论上不受位数限制。但“能连”不等于“每层都能连”。ODBC 这层最容易踩坑32 位客户端注册的是 32 位 ODBC 驱动如果应用程序是 64 位默认去读 64 位 ODBC 数据源就会找不到驱动。这跟你用不用 21c 没关系是 Windows 注册表位数隔离的机制问题。我自己的习惯是在一台机器上尽量不要混装 32 位和 64 位客户端如果开发环境实在避不开至少在连接字符串里明确指定所用驱动名称。磁盘和内存也值得说一句。Administrator 完整安装类型大概要占 4 到 5 GBRuntime 类型占 3 GB 左右Instant Client 类型最小几百 MB 就能跑。OUI 安装过程中内存占用 500 MB 以上虚拟机给 1 GB 内存往往在最后配置阶段卡半天。网络方面装好之后 1521 端口是否能到数据库服务器决定了 tnsping 成不成立。2.4 和 Instant Client 的差别什么时候用这个大包什么时候用轻量包Oracle 的即时客户端Instant Client在 Windows 上也有 zip 包比如很多博客里提到的“适用于 Microsoft Windows (x86) 64 位的 Instant Client”。它和 NT_213000_client.zip 这种完整客户端介质定位完全不同。InstalClient 本质上是一堆运行时动态库主要给应用程序嵌入式连接用完整客户端则包含 sqlplus、tnsping、netca、ODBC 驱动、企业管理器插件等工具链。我的做法通常是这样的开发机只想跑几个 SQL 验证数据用 Instant Client 就行因为解压即用改一下 PATH 和 TNS_ADMIN 就能跑DBA 和运维桌面机则装完整客户端因为你要用 netca 配置监听、用 tnsping 逐跳排查网络、用完整 sqlplus 跑巡检脚本。NT_213000_client.zip 这个包对应的是完整客户端所以后面讲的安装类型和管理工具Instant Client 都沾不上边。3. 安装到 Windows 的三种路径图形向导、响应文件与纯静默3.1 图形安装向导第一次安装建议完整走一遍第一次装 Oracle 21c 客户端时我会先用图形向导完整跑一遍点过每一个界面确认参数是合理的。原因是 OUI 图形界面的排错能力比静默强而且它会生成一份响应文件你之后再做静默安装可以直接拿它改。双击解压目录下的 setup.exe 后大致流程是第一步是配置安全更新把“我希望通过 My Oracle Support 接收安全更新”这个勾选去掉不然它会死等一个邮箱地址。第二步选择安装选项这里重点看“设置软件仅安装”类型客户端不需要建库。第三步选安装类型Administrator、Runtime、Instant Client 三选一。第四步选 Oracle 基目录和主目录比如 ORACLE_BASEC:\app\oracle、ORACLE_HOMEC:\app\oracle\product\21.0.0\client_1。第五步是 OUI 做先决条件检查这一页最容易暴露出 cvuauth 权限、磁盘不足之类的问题。全部走完之后OUI 会在最终的“概要”页显示这次安装的具体参数。我习惯在这一步截图留档然后把概要内容复制到一个 txt 里。这个 txt 就是你后续排错和写响应文件的基准。3.2 安装类型三个选项Administrator、Runtime、Instant Client 怎么选安装类型这块很多人直接默认选第一个这个习惯不好。三个类型的工具集完全不一样Administrator包含 sqlplus、tnsping、Oracle Net Manager、ODBC 驱动、OLE DB 驱动还带企业管理器相关组件。适合 DBA 桌面和运维跳板机。Runtime包含 SQL*Plus、OCI 驱动、ODBC 驱动但不带 netca 这类配置工具。适合应用服务器或者只把客户端当作连接底座的项目。Instant Client最小集合基本就是运行时库加少量命令行工具适合嵌入到应用包里头。如果你拿不准选哪个我建议直接选 Administrator。它多出来的工具在排查网络问题时能救急而且磁盘占用多一两 GB对现代机器来说不算负担。Runtime 适合那种被安全策略限制得很死的服务器不让装多余组件。三者的配置文件路径也不完全一样Administrator 和 Runtime 都带%ORACLE_HOME%\network\admin这个目录Instant Client 则强依赖你自己设置的 TNS_ADMIN。所以后面配置 tnsnames.ora 之前先确认你装的是哪一型。3.3 静默安装用一份响应文件批量复现几十台机器要装同样的客户端不可能一台一台去点图形界面。Oracle 的 OUI 支持响应文件方式把安装参数汇总到一个 rsp 文件里然后由 setup.exe 读取执行。我一般先在一台机器上用图形界面装成功再到安装介质的 response 目录里找到安装期间生成的client_install.rsp把它拷出来改一下作为批量安装模板。attention不同版本 OUI 对响应文件的字段要求不完全一致直接拿别人的响应文件套到 21c 上有风险。常见做法是用自己介质里自带的模板或者用图形界面“保存响应文件”功能导出。一份精简的客户端响应文件长这样[GENERIC] ORACLE_HOMEC:\app\oracle\product\21.0.0\client_1 ORACLE_BASEC:\app\oracle INSTALL_TYPEAdministrator SELECTED_LANGUAGESen,zh_CN DECLINE_SECURITY_UPDATEStrue SECURITY_UPDATES_VIA_MYORACLESUPPORTfalse这几个参数的含义逐条说明ORACLE_HOME 是客户端安装目标目录必须保证路径里没有中文和空格ORACLE_BASE 是 Oracle 文件布局的根目录建议独立于系统盘INSTALL_TYPE 对应上一节说的 Administrator/Runtime/Instant Client这里值要跟你想装的类型完全一致SELECTED_LANGUAGES 控制安装后 sqlplus 帮助和错误信息的语言集DECLINE_SECURITY_UPDATES 必须为 true否则静默安装会因为没有输入邮箱而中止。响应文件准备好后在管理员权限的 cmd 里执行setup.exe -silent -responseFile C:\temp\client_install.rsp -nowelcome -norecovery -waitForCompletion命令里各参数的作用-silent 表示不显示图形界面-responseFile 指向刚才改好的响应文件-nowelcome 跳过欢迎页避免交互-norecovery 让 OUI 在失败时不生成恢复文件防止后台残留任务-waitForCompletion 让 cmd 窗口一直等安装结束拿到退出码。执行时有个细节如果担心环境不干净可以加-ignorePrereq跳过先决条件检查。但我不建议默认加这个参数否则本来能暴露出来的权限问题会被静默带过装完才报错排查成本更高。安装日志会写在%TEMP%\OraInstall目录下里面有silentInstall开头的日志文件这一步如果卡住就看日志末尾停在哪个任务上。3.4 重装与残留清理remove_cvuresource_baseline.bat 的实际用法Oracle 客户端最让人头疼的安装失败不是装不上而是装到一半失败之后重装永远提示“检测到已有残留”。这个残留很多来自 CVUCluster Verification Utility的记录。第一次安装时OUI 会在系统里写入 CVU 基线数据失败后不会自动清理第二次安装的预检查就会拿新环境去和旧基线比对报一堆莫名其妙的冲突。我一般在卸载完客户端、确定要重新安装时先跑一次安装介质里的remove_cvuresource_baseline.bat把它放在管理员 cmd 里执行等它输出“done”字样再重装。这相当于给安装环境吃了颗后悔药能省掉大半重装排错时间。跑完之后最好同时清理掉%ORACLE_HOME%和%TEMP%\OraInstall残留目录再检查 PATH 里是否还有指向旧 home 的路径项有就删掉避免混淆。4. 把客户端配到能直接连库环境变量、tnsnames.ora 与第一次连接4.1 环境变量ORA 系列变量的优先级问题装完 21c 客户端第一件事不是急着连库而是把环境变量捋顺。关键变量有三个ORACLE_HOME、TNS_ADMIN、PATH。ORACLE_HOME 建议固定指向当前客户端的主目录比如 C:\app\oracle\product\21.0.0\client_1TNS_ADMIN 指向放 tnsnames.ora 和 sqlnet.ora 的目录PATH 里要把%ORACLE_HOME%\bin放在显眼位置。我见过最多的翻车场景是机器上装过旧版客户端PATH 里先写着 11g 的 bin后追加了 21c 的 bin。结果 cmd 里运行 sqlplus实际调起来的是旧版本ORA-12154、ORA-12560 轮着报。排查的时候用where sqlplus能看到究竟调用了哪个路径。所以我在配置环境变量时会把新客户端的 bin 放在 PATH 靠前的位置并且把旧客户端的 bin 从 PATH 里删掉。4.2 tnsnames.ora 标准写法SERVICE_NAME 与 SID 的差异tnsnames.ora 是客户端连接数据库的“通讯录”。它在 21c 客户端里的默认位置是%ORACLE_HOME%\network\admin\tnsnames.ora但只要你设了 TNS_ADMIN就以 TNS_ADMIN 指向的目录为准。这个文件不设 TNS_ADMIN 也能工作但为了多版本共存我强烈建议显式设置。典型配置如下ORCL (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.15)(PORT 1521)) ) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orclpdb1) ) )这里的 HOST 是数据库服务器 IPPORT 是监听端口SERVICE_NAME 对应实例注册的服务名。注意 SERVICE_NAME 和 SID 不是一回事SID 是实例名一个实例可以注册多个服务SERVICE_NAME 更贴合 RAC 和 PDB 场景。如果连的是 Oracle 21c 的 PDBSERVICE_NAME 要填 PDB 的服务名不能直接填 CDB 的实例名。写好后可以用tnsping ORCL验证。返回OK (20 msec)这类输出说明网络层已经通了如果返回 TNS-03505 或者 TNS-12154多半是服务名写错或者文件路径没对上。此时先检查 TNS_ADMIN 环境变量再看监听器里实际注册的服务名用lsnrctl services查询更准。4.3 sqlnet.ora 里真正影响连接的三个参数sqlnet.ora 在同一个目录下看起来是可选文件实际上能决定很多疑难连接问题的走向。排错时我会重点看三个参数SQLNET.AUTHENTICATION_SERVICESWindows 上通常设为(NTS)表示启用 Windows 本地认证。如果你用系统账号登录数据库这个参数不能乱删。NAMES.DIRECTORY_PATH控制名称解析顺序。推荐写成(TNSNAMES, EZCONNECT)先读 tnsnames.ora再允许 EZCONNECT 那种无文件连接。SQLNET.INBOUND_CONNECT_TIMEOUT客户端向内连接的超时一般默认就好不推荐手动调小容易在慢网络上造成误杀。sqlnet.ora 改完不需要重启任何服务sqlplus 下一次发起连接时重新读取配置。遇到“连接建立超时”这类问题我常常在 sqlnet.ora 里临时把诊断参数打开比如记录客户端日志但生产环境改完一定要记得还原。4.4 第一次连接sqlplus 与 tnsping 的标准套路配置完成后在 cmd 里按顺序执行下面四条命令set ORACLE_HOMEC:\app\oracle\product\21.0.0\client_1 set PATH%ORACLE_HOME%\bin;%PATH% set TNS_ADMINC:\app\oracle\network\admin tnsping ORCLtnsping 通过后再跑 sqlplus 连接sqlplus system/密码ORCL进入 sqlplus 后可以先用select name from v$database;确认当前连接的库再用show parameter db_unique_name;核对实例信息。第一次连接如果卡在“ERROR: ORA-12514”大概率是 SERVICE_NAME 写错如果报“ORA-12541”说明监听还没起来如果报“ORA-12560”则要查本机默认实例的冲突。后面避坑章节里这几条我会展开写具体排查方法。5. 避坑21c 客户端装完最容易翻车的六件事5.1 ORA-12154连接标识符无法解析现象执行sqlplus system/密码ORCL系统返回ORA-12154: TNS:could not resolve the connect identifier specified。原因常见有三种可能。一是 tnsnames.ora 里根本没有 ORCL 这个条目二是 TNS_ADMIN 指向的目录不是实际的 network/admin三是 tnsnames.ora 文件里存在语法错误比如括号不匹配。解决先把 TNS_ADMIN 设置到正确目录再确认文件名是 tnsnames.ora 而不是 tnsnames.txt。然后用tnsping ORCL复现报错。如果 tnsping 能通、sqlplus 报错多半是 sqlplus 读取的 tnsnames 文件路径不对去环境变量里找 PATH 中是否混入了旧版客户端 bin导致 sqlplus 加载的不是 21c 的 oracle 网络库。我通常直接用%ORACLE_HOME%\bin\tnsping.exe全路径测试避免被 PATH 干扰。5.2 ORA-12560协议适配器报错现象sqlplus 本机连接时直接返回ORA-12560: TNS:protocol adapter error但连接远程库却正常。原因这台机器上很可能设了 ORACLE_SID 环境变量sqlplus 认为你要连本机默认实例而本机根本没装数据库服务。还有一种情况是本机装了数据库服务但服务没启动。解决客户端场景下先把 ORACLE_SID 清掉不让 sqlplus 走默认连接逻辑。在 cmd 里执行set ORACLE_SID sqlplus system/密码ORCL如果确实要连本机实例就检查 Windows 服务管理器里 OracleService 是否处于“正在运行”状态。很多 Windows 重启后数据库服务没自启就会出现 Oracle 服务和网络服务全开但实例没起来连报 ORA-12560 的情况。5.3 无法获取有关 Windows NT 组/用户的信息现象安装界面在预检查阶段弹出错误日志里出现“无法获取有关 Windows NT 组/用户 的信息”字样。原因OUI 在注册服务时需要读取 Windows 本地用户组如果当前账号不是管理员组成员或者本机名称包含中文字符Windows API 在枚举组信息时就会失败。这个报错在非域机器上非常典型尤其是系统用户名用中文登录时更容易触发。解决先用管理员账号退出后重新登录确认当前 shell 是提权状态再把安装目录和 oracle base 放到纯英文路径下。如果本机名带中文可以在安装前临时修改计算机名装完后再改回来但改计算机名需要重启所以一般我会优先尝试用英文管理员账号跑安装。实在不行就去日志里定位是在哪一步调用 cvuhelper.bat先单独手动跑一遍该脚本确认 CVU 权限的问题点到底在哪个检查项。5.4 32 位 ODBC 驱动和 64 位应用互相找不到现象应用程序报“找不到数据源名称”或“找不到驱动”但系统 ODBC 数据源管理器里明明配置了 Oracle 驱动。原因Windows 的 ODBC 驱动按位数隔离。32 位客户端注册的是 32 位驱动而应用程序如果是 64 位它读的是 64 位注册表里的数据源。反过来也一样。很多人在 64 位的“ODBC 数据源管理器”里看不到 Oracle 驱动就以为驱动没装其实是打开的工具位数不对。解决在 64 位 Windows 上管理员运行区分的两个 ODBC 管理器。32 位驱动用C:\Windows\SysWOW64\odbcad32.exe查看64 位驱动用C:\Windows\System32\odbcad32.exe查看。按应用程序的位数选对应客户端如果两条连接都要支持就分别建两个不同的 DSN 名称并在连接字符串里显式写上“Driver{Oracle in OraClient21Home1_32bit}”这类名称。5.5 静默安装卡在“正在配置”没有任何提示现象运行 setup.exe -silent 之后cmd 窗口一直停在原处任务管理器里能看到进程但硬盘半天没动静也没有错误弹窗。原因静默安装没有界面有用的信息全在日志里。卡住通常是因为响应文件里 ORACLE_HOME 指向的目录已经被占用或者先决条件检查停在某个需要交互的弹窗上比如 Inventory 目录确认框。OUI 里有些信息是真人安装时才会点静默时就成了悬空等待。解决第一时间去看%TEMP%\OraInstall下的日志我常用 PowerShell 快速定位Get-ChildItem $env:TEMP\OraInstall -Recurse -Filter *.log | Sort-Object LastWriteTime | Select-Object -Last 5找出最新日志看末尾是不是停在OUIThe.exe或者cvuauth相关进程。如果是 cvuauth就用前面讲的 NT 组用户权限问题先解决如果是路径占用换一个干净的 ORACLE_HOME 路径再跑。另外建议给-waitForCompletion参数这样 cmd 能拿到安装退出码确认到底成没成功。5.6 杀毒软件把 blacklist 或 fontconfig.bfc 隔离掉了现象安装过程中提示找不到某个文件或者图形界面花屏、汉字变成方块。原因Oracle 介质里 blacklist 文件和 fontconfig.bfc 的路径、扩展名比较特殊某些杀软会误报为风险文件直接隔离。文件一丢OUI 在配置阶段就会报缺失而字体配置文件丢了图形向导会渲染成乱码。解决解压前先把安装目录加进杀软白名单解压过程不要改动这里面的文件。如果文件已经被隔离先从隔离区恢复或者重新解压一份 zip。我在安装完后再把杀软开回来这样既不影响日常使用也避免安装过程被中途打断。黑名单文件最好保留原样它会影响 OUI 清理阶段对旧文件的判断误删风险反而比中病毒更大。6. 把连接验证做成一条命令tnsping、sqlplus 与日志回显6.1 一个通用的 Windows 连接自检脚本装好客户端、配好 tnsnames 之后我总会在交付给前端之前把连接验证标准化成一条批处理命令。这个脚本的作用是让一个完全不懂 Oracle 接手的人也能一眼看出客户端通不通echo off set ORACLE_HOMEC:\app\oracle\product\21.0.0\client_1 set PATH%ORACLE_HOME%\bin;%PATH% set TNS_ADMINC:\app\oracle\network\admin echo [%date% %time%] 开始连接自检 conn_test.log tnsping ORCL 3 conn_test.log 21 echo select 1 from dual; | sqlplus -S system/密码ORCL conn_test.log 21 if %errorlevel% equ 0 ( echo [%date% %time%] 连接测试通过 conn_test.log ) else ( echo [%date% %time%] 连接测试失败 conn_test.log ) type conn_test.log脚本逻辑很简单但我每次写都要提醒自己三件事第一sqlplus 后面那串密码别硬编码在共享文档里建议改用外部变量传入第二select 1 from dual是最轻量的连通性验证不依赖任何业务表第三日志里的时间戳最好用%date% %time%这样多次执行能看出趋势。6.2 让脚本在失败时返回非 0 退出码上面脚本里我用%errorlevel%判断成功与否。但更严格的做法是在管道命令后强制检查echo select 1 from dual; | sqlplus -S system/密码ORCL set EXIT_CODE%errorlevel% if %EXIT_CODE% neq 0 ( echo 连接失败退出码 %EXIT_CODE% exit /b 1 )这条经验来自于一次教训有一次脚本里 sqlplus 明明报错但外层流程还是继续往下走最后推了一个坏配置到生产。后来我发现echo ... | sqlplus的管道符号会让 sqlplus 返回的退出码被 echo 命令的退出码覆盖所以必须紧跟一条set EXIT_CODE%errorlevel%。从那以后我每次写连接验证批处理都强制走一遍“先捕获退出码再判断分支”的流程不敢再贪省事。6.3 记录基线对比波动连接自检不只是装完后跑一次。我习惯把第一次成功输出的 tnsping 耗时、日志文件大小、响应时间存成基线文件。之后网络或防火墙调整再跑同一条命令对比波动一眼就能看出来。尤其 21c 的客户端在多租户环境里PDB 的 SERVICE_NAME 经常变连接验证脚本反而比查文档更快暴露问题。希望这套方法也能帮你减少在客户端连接上反复试错的时间。本文还有配套的精品资源点击获取
返回列表