【MyDB】7-客户端服务端通信之3-Client的实现

【MyDB】7-客户端服务端通信之3-Client的实现

前言

Client的实现
Client类中实现了execute,核心在于接收字节数组并封装成为Package,之后通过RoundTrip类向服务器发送消息,返回服务端返回的Package中的Data
RoundTripper类:向Server发送请求,并接收server的响应
Shell则接收命令行传来的命令,通过调用Clent中的execute,让后端执行命令并得到返回的结果。
Launcher:客户端的启动入口,启动Shell并调用shell的run方法,监听命令行输入的命令

客户端连接服务器的过程,也是背板。客户端有一个简单的 Shell,实际上只是读入用户的输入,并调用 Client.execute()。

public byte[] execute(byte[] stat) throws Exception {
    Package pkg = new Package(stat, null);
    Package resPkg = rt.roundTrip(pkg);
    if(resPkg.getErr() != null) {
        throw resPkg.getErr();
    }
    return resPkg.getData();
}

RoundTripper 类实际上实现了单次收发动作:

public Package roundTrip(Package pkg) throws Exception {
    packager.send(pkg);
    return packager.receive();
}

Launcher

最后附上客户端的启动入口,很简单,把 Shell run 起来即可:

public class Launcher {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("127.0.0.1", 9999);
        Encoder e = new Encoder();
        Transporter t = new Transporter(socket);
        Packager packager = new Packager(t, e);

        Client client = new Client(packager);
        Shell shell = new Shell(client);
        shell.run();
    }
}
### Oracle RAC NAT 映射 1521 端口可访问但连接数据库报 ORA-12541 的解决方案 ORA-12541 错误通常表示监听器无法接受连接请求。此问题可能由多种原因引起,包括但不限于监听器配置不当、TNS 配置文件设置错误或网络层的 NAT 映射未正确处理。 #### 一、确认监听器状态 确保 Oracle 监听器已启动并正在运行。可以通过以下命令验证监听器的状态: ```bash lsnrctl status ``` 如果监听器未启动,则可以尝试重新启动它: ```bash lsnrctl start ``` 此外,在 `listener.ora` 文件中需明确指定主机名和 IP 地址,避免因 NAT 导致解析冲突[^1]。 --- #### 二、检查 TNS 配置文件 (`tnsnames.ora`) 在客户端服务端都需要正确配置 `tnsnames.ora` 文件。以下是标准的配置模板: 对于服务端: ```plaintext MYDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 外网映射后的IP地址)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = nat123) ) ) ``` 注意:当使用 NAT 映射时,应将 `HOST` 字段替换为外部能够访问的实际 IP 地址,而不是内网的真实地址[^2]。 --- #### 三、调整 SQLNET 参数 为了防止潜在的安全风险,可以在 `sqlnet.ora` 中限制允许访问的 IP 范围。例如: ```plaintext TCP.VALIDNODE_CHECKING = YES TCP.INVITED_NODES = (外网映射后的IP地址) ``` 上述参数会强制监听器仅接受来自特定 IP 地址范围内的连接请求,从而减少不必要的干扰[^3]。 --- #### 四、排查 NAT 和防火墙影响 即使 1521 端口在网络层面已经开放,仍可能存在某些中间设备阻止完整的通信链路建立。建议执行如下操作来排除这些可能性: 1. **Ping 测试**:从客户端 ping 到目标服务器以检验基本连通性; 2. **Telnet 测试**:利用 telnet 命令模拟一次简单的 TCP 连接过程,观察是否存在异常中断现象; ```bash telnet <外网映射后的IP> 1521 ``` 3. 如果发现有丢包或者延迟过高情况,联系网络管理员优化路由策略;另外还需核查是否有额外安全机制(比如 IPSec 或 WAF)介入其中造成阻碍效果[^4]。 --- #### 五、日志分析与调试模式启用 开启详细的跟踪记录有助于快速定位具体环节上的失误之处。修改 listener 日志级别至最高档位以便收集更多有用数据供后续诊断参考之用。 编辑 `$ORACLE_HOME/network/admin/listener.ora` 添加下面几行内容之后重启 service 即生效: ```plaintext LOG_DIRECTORY_LISTENER=$ORACLE_BASE/diag/tnslsnr/<hostname>/listener/trace/ TRACE_LEVEL_CLIENT= SUPPORT DIAG_ADR_ENABLED_listener=false ADR_BASE_listener=/u01/app/oracle/product/11.2.0/dbhome_1/log ``` 最后再次查看最新产生的 trace file 是否含有任何关于拒绝接入方面的描述信息作为进一步改进依据. --- ### 结论 综上所述,针对 Oracle RAC 环境下通过 NAT 映射 1521 端口后出现 ORA-12541 错误的情况,可以从以下几个方面入手解决问题:一是核实监听器工作状况及其关联配置项准确性;二是审阅 tnsnames 定义是否匹配实际需求场景;三是考虑 sqlnet 层面设定的影响因素;四是深入探究网络架构设计合理性以及相关联防护措施的有效程度;最终借助全面的日志体系辅助完成整个修复流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值