rustdx-complete 1.0.0

功能完整的 A 股数据获取库,支持数据验证、技术指标、智能缓存、交易日历
# rustdx-complete 网络连接说明

## ⚠️ 重要澄清

### rustdx-complete 不需要本地通达信服务器!

**常见误解**:
- ❌ 错误:需要在本地运行通达信服务(端口 2222)
- ❌ 错误:需要配置本地 TCP 服务
- ✅ 正确:rustdx-connect 直接连接**通达信公共服务器**

---

## 🌐 工作原理

### 连接流程

```
你的应用
rustdx-complete (TCP 客户端)
通达信公共服务器 (115.238.56.198:7709)
返回股票数据
```

### 服务器列表

rustdx-complete 内置了 19 个通达信公共服务器(位于 `src/tcp/ip.rs`):

| 服务器地址 | 端口 | 状态 |
|-----------|------|------|
| 115.238.56.198 | 7709 | ✅ 推荐(默认) |
| 114.80.149.19 | 7709 | ✅ 可用 |
| 114.80.149.22 | 7709 | ✅ 可用 |
| 39.100.68.59 | 7709 | ⚠️ 可能不返回数据 |
| ... | 7709 | - |

**完整列表**: 见 `src/tcp/ip.rs` 中的 `STOCK_IP` 数组

---

## 🚀 正确使用方式

### 基础使用

```rust
use rustdx_complete::tcp::{Tcp, Tdx};
use rustdx_complete::tcp::stock::SecurityQuotes;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 创建连接(自动连接到远程服务器)
    let mut tcp = Tcp::new()?;  // 连接到 115.238.56.198:7709

    // 2. 查询股票数据
    let mut quotes = SecurityQuotes::new(vec![
        (0, "000001"),  // 平安银行
        (1, "600000"),  // 浦发银行
    ]);

    quotes.recv_parsed(&mut tcp)?;

    // 3. 打印结果
    for quote in quotes.result() {
        println!("{}: {}", quote.code, quote.price);
    }

    Ok(())
}
```

### 使用备用服务器

如果默认服务器不可用,可以指定其他服务器:

```rust
use rustdx_complete::tcp::{Tcp, Tdx};
use std::net::SocketAddr;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 方法1: 使用内置服务器的索引
    let mut tcp = Tcp::new_with_ip(&rustdx_complete::tcp::ip::STOCK_IP[1])?;

    // 方法2: 自定义服务器地址
    let addr: SocketAddr = "114.80.149.19:7709".parse()?;
    let mut tcp = Tcp::new_with_ip(&addr)?;

    Ok(())
}
```

---

## 🔧 故障排查

### 问题 1: 连接超时

**现象**:
```
Error: TimedOut
```

**原因**:
- 网络连接问题
- 防火墙阻止
- 服务器暂时不可用

**解决方案**:
```rust
use rustdx_complete::tcp::ip::STOCK_IP;

// 尝试多个服务器
for (i, addr) in STOCK_IP.iter().enumerate().take(5) {
    println!("尝试服务器 #{}: {}", i + 1, addr);
    match Tcp::new_with_ip(addr) {
        Ok(mut tcp) => {
            println!("✅ 连接成功!");
            // 使用这个连接
            return Ok(());
        }
        Err(e) => {
            println!("❌ 失败: {}", e);
        }
    }
}
```

### 问题 2: 无法解析域名

**现象**:
```
Error: TryAddrError
```

**解决方案**:
- 使用 IP 地址而不是域名
- 检查 DNS 设置
- 尝试其他服务器

### 问题 3: 返回空数据

**现象**:连接成功,但数据为空

**原因**:
- 服务器可能临时不返回数据(如 39.100.68.59)
- 非交易时间

**解决方案**:
```rust
// 使用已知可用的服务器
let addr: SocketAddr = "115.238.56.198:7709".parse()?;
let mut tcp = Tcp::new_with_ip(&addr)?;
```

---

## 📊 网络要求

### 必需条件

✅ **互联网连接**(连接到通达信服务器)
✅ **TCP 协议**(端口 7709)
✅ **防火墙允许出站连接**

### 不需要

❌ 本地通达信软件
❌ 本地 TCP 服务器
❌ 端口 2222 或其他本地端口
❌ VPN(除非你的网络限制访问)

---

## 🧪 测试连接

### 方法 1: 使用 cargo test

```bash
# 测试所有内置服务器
cargo test check_all_stock_ips -- --nocapture
```

输出示例:
```
✅ 检测到 15 个可用服务器 (总共 19 个):
  - 115.238.56.198:7709
  - 114.80.149.19:7709
  - 114.80.149.22:7709
  ...
```

### 方法 2: 使用 netcat

```bash
# 测试连接到通达信服务器(不是本地!)
nc -zv 115.238.56.198 7709

# 成功输出:
# Connection to 115.238.56.198 7709 port [tcp/*] succeeded!
```

### 方法 3: 使用示例程序

```bash
cargo run --example test_security_quotes
```

---

## 🔐 安全说明

### 数据来源

- **服务器**: 通达信公共服务器
- **协议**: 自定义 TCP 协议(与 pytdx 相同)
- **数据**: 公开的股票行情数据
- **安全**: 无需认证,只读数据

### 隐私

- ❌ 不收集个人信息
- ❌ 不上传数据
- ✅ 仅下载公开行情数据

---

## 📝 常见问题 (FAQ)

### Q: 为什么我看到"端口 2222"的错误?

**A**: 这是一个误解。rustdx-complete 不使用端口 2222。我们连接的是远程服务器的 7709 端口。

### Q: 我需要安装通达信软件吗?

**A**: 不需要。rustdx-complete 是独立的 Rust 库。

### Q: 可以在服务器环境使用吗?

**A**: 可以!只要有互联网连接即可。

### Q: 为什么有多个服务器?

**A**:
- 负载均衡
- 高可用性
- 地理分布(不同地区连接速度不同)

### Q: 如何选择最快的服务器?

**A**:
```rust
use rustdx_complete::tcp::ip::STOCK_IP;

let mut fastest = None;
let mut min_duration = std::time::Duration::from_secs(999);

for addr in STOCK_IP.iter().take(5) {
    let start = std::time::Instant::now();
    if let Ok(_) = Tcp::new_with_ip(addr) {
        let duration = start.elapsed();
        if duration < min_duration {
            min_duration = duration;
            fastest = Some(*addr);
        }
    }
}

if let Some(addr) = fastest {
    println!("最快的服务器: {} ({:?})", addr, min_duration);
}
```

---

## 🆘 获取帮助

如果仍然遇到连接问题:

1. **检查网络**: `ping 115.238.56.198`
2. **检查防火墙**: 确保允许 TCP 出站连接
3. **查看日志**: 设置 `RUST_LOG=debug` 环境变量
4. **提交 Issue**: [https://github.com/jackluo2012/rustdx/issues]https://github.com/jackluo2012/rustdx/issues

---

## 📚 相关资源

- [项目 README]../README.md
- [pytdx (Python版本)]https://pypi.org/project/pytdx/
- [通达信官网]http://www.tdx.com.cn/

---

**最后更新**: 2026-01-05
**版本**: v0.6.6