Pharos
Global

Dial - 建立网络连接

建立 TCP、TLS 或 WebSocket 连接。

语法

python
# TCP 连接
conn = Dial("example.com:80")

# WebSocket 连接
ws = Dial("wss://stream.binance.com:9443/ws/btcusdt@kline_1m")

# 带协议的连接
conn = Dial("tcp://example.com:80")
conn = Dial("tls://example.com:443")

参数

参数名类型必选默认值说明
addressstring连接地址,支持多种格式
timeoutnumber10000超时时间(毫秒)

地址格式

格式说明示例
host:port默认TCP连接"baidu.com:80"
tcp://host:portTCP连接"tcp://example.com:80"
tls://host:portTLS加密连接"tls://example.com:443"
ws://host:port/pathWebSocket连接"ws://echo.websocket.org"
wss://host:port/path安全WebSocket"wss://stream.binance.com:9443/ws"

返回值

返回连接对象,失败返回 None

TCP 连接对象方法

方法说明
read(size)读取数据
write(data)写入数据
close()关闭连接

WebSocket 连接对象方法

方法说明
recv(timeout_ms)接收消息
send(data)发送消息
ping(payload)发送ping帧
pong(payload)发送pong帧
close()关闭连接
subscribe(params)订阅(通用格式)
unsubscribe(params)取消订阅

示例

示例1: WebSocket 实时行情

python
import json

# 连接到 Binance WebSocket
ws = Dial("wss://stream.binance.com:9443/ws/btcusdt@kline_1m")

if ws:
    Log("✅ WebSocket 已连接")
    
    while True:
        # 接收消息
        msg = ws.recv(5000)  # 5秒超时
        
        if msg:
            data = json.loads(msg)
            kline = data['k']
            Log(f"时间: {_D(kline['t']/1000)}")
            Log(f"收盘价: {kline['c']}")
        else:
            # 超时,发送 ping 保持连接
            ws.ping()
        
        Sleep(100)
else:
    Log("❌ WebSocket 连接失败")

示例2: 订阅多个频道

python
ws = Dial("wss://stream.binance.com:9443/ws")

if ws:
    # 订阅K线和交易数据
    ws.subscribe(["btcusdt@kline_1m", "btcusdt@trade"])
    
    while True:
        msg = ws.recv(5000)
        if msg:
            data = json.loads(msg)
            Log(f"收到数据: {data}")
        
        Sleep(100)

示例3: TCP 连接

python
# 连接到服务器
conn = Dial("tcp://example.com:8080", 5000)

if conn:
    # 发送数据
    conn.write("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
    
    # 读取响应
    response = conn.read(4096)
    if response:
        Log(f"响应: {response}")
    
    # 关闭连接
    conn.close()

示例4: WebSocket 心跳保持

python
import time

ws = Dial("wss://stream.example.com/ws")
last_ping = time.time()

while True:
    # 每30秒发送一次ping
    if time.time() - last_ping > 30:
        ws.ping()
        last_ping = time.time()
        Log("发送心跳")
    
    # 接收消息
    msg = ws.recv(1000)
    if msg:
        Log(f"收到: {msg}")
    
    Sleep(100)

注意事项

  1. 连接管理: 记得在不使用时调用 close() 关闭连接

  2. 超时设置: WebSocket recv() 方法支持超时参数

  3. 心跳维护: 长连接需要定期发送 ping 保持活跃

  4. 错误处理: 连接失败返回 None,应检查返回值

  5. 依赖库: WebSocket 需要 websocket-client

  6. 数据格式:

    • WebSocket 通常收发 JSON 字符串
    • TCP 收发原始字节数据
  7. 协议选择:

    • 实时行情: 使用 WebSocket
    • 简单请求: 使用 HttpQuery
    • 自定义协议: 使用 TCP/TLS

相关 API