Dial
用于原始的Socket访问,支持tcp、udp、tls、unix协议。
支持 4 种主流的通信协议:mqtt、nats、amqp、kafka。
支持连接数据库,可连接的数据库包括:sqlite3、mysql、postgres、clickhouse。
Dial(address)
Dial(address, timeout)
Dial(address, options)示例
-
Dial 函数调用示例:
javascriptfunction main(){ // Dial 支持 tcp://、udp://、tls://、unix:// 协议,可传入一个参数指定超时的秒数 var client = Dial("tls://www.baidu.com:443") if (client) { // write 可再跟一个数字参数指定超时,write 返回成功发送的字节数 client.write("GET / HTTP/1.1\nConnection: Closed\n\n") while (true) { // read 可再跟一个数字参数指定超时,单位:毫秒。返回 null 表示出错、超时或 socket 已关闭 var buf = client.read() if (!buf) { break } Log(buf) } client.close() } }pythondef main(): client = Dial("tls://www.baidu.com:443") if client: client.write("GET / HTTP/1.1\nConnection: Closed\n\n") while True: buf = client.read() if not buf: break Log(buf) client.close()rustfn main() { // Dial 支持 tcp://、udp://、tls://、unix:// 协议,可使用 Dial::new(addr, timeout) 指定超时的秒数 let mut client = Dial("tls://www.baidu.com:443"); if client.Valid() { // write 的第二个数字参数指定超时,write 返回成功发送的字节数 client.write("GET / HTTP/1.1\nConnection: Closed\n\n", 0); loop { // read 的数字参数指定超时,单位:毫秒。返回空字符串表示出错、超时或 socket 已关闭 let buf = client.read(0); if buf == "" { break; } Log!(buf); } client.close(); } }c++void main() { auto client = Dial("tls://www.baidu.com:443"); if(client.Valid) { client.write("GET / HTTP/1.1\nConnection: Closed\n\n"); while(true) { auto buf = client.read(); if(buf == "") { break; } Log(buf); } client.close(); } } -
Dial函数连接数据库时返回的连接对象具有2个独有的方法函数:
-
exec(sqlString): 用于执行SQL语句,使用方式与DBExec()函数类似。-
fd():fd()函数返回一个句柄(例如:句柄变量为handle),用于在其它线程中重连(即使Dial创建的连接对象已通过close()函数关闭连接),只需将该句柄传入Dial()函数即可重用连接,例如:Dial(handle)。以下是使用Dial函数连接
sqlite3数据库的示例。javascriptvar client = null function main() { // client = Dial("sqlite3://:memory:") // 使用内存数据库 client = Dial("sqlite3://test1.db") // 打开/连接托管者所在目录的数据库文件 // 记录句柄 var sqlite3Handle = client.fd() Log("sqlite3Handle:", sqlite3Handle) // 查询数据库中的表 var ret = client.exec("SELECT name FROM sqlite_master WHERE type='table'") Log(ret) } function onexit() { Log("执行client.close()") client.close() }python// 不支持rustfn main() { // let mut client = Dial("sqlite3://:memory:"); // 使用内存数据库 let mut client = Dial("sqlite3://test1.db"); // 打开/连接托管者所在目录的数据库文件 // Rust 的连接对象不支持 fd() 方法 // 查询数据库中的表 let ret = client.exec("SELECT name FROM sqlite_master WHERE type='table'"); Log!(format!("{:?}", ret)); Log!("执行client.close()"); client.close(); }c++// 不支持
返回值
| 类型 | 描述 | ||||||||||||||||||||
object | 如果连接超时,
WebSocket协议推送过来的数据,如果策略中两次
|
参数
| 名称 | 类型 | 必填 | 描述 |
address | string | 是 | 请求地址。 |
timeout | number | 否 | 超时时间,单位为秒。 |
options | object | 否 | 连接配置选项。 |
备注
address参数的详细说明:在标准地址wss://xxx.xxx.xxx:10441/websocket?compress之后,以|符号进行分隔。如果参数字符串中包含|字符,则使用||作为分隔符。分隔符之后的部分为功能参数设置,各参数之间使用&字符连接。
例如,同时设置ss5代理与压缩参数时,可写作:
Dial("wss://baidu.com/stream|proxy=socks5://xxx:9999&compress=gzip_raw&mode=recv")
| Dial函数的address参数支持的功能 | 参数说明 |
|---|---|
| WebSocket协议数据压缩相关的参数:compress=参数值 | compress用于指定压缩方式,可选值包括gzip_raw、gzip等。如果所用的gzip并非标准gzip,可使用扩展方式:gzip_raw |
| WebSocket协议数据压缩相关的参数:mode=参数值 | mode用于指定压缩模式,可选dual、send、recv三种。dual为双向压缩,即发送和接收均使用压缩数据;send为仅发送压缩数据;recv为接收压缩数据并在本地解压缩。 |
| WebSocket协议启用compression设置:enableCompression=true | 设置enableCompression=false可关闭该功能,默认不启用。 |
| WebSocket协议设置底层自动重连相关的参数:reconnect=参数值 | reconnect用于设置是否自动重连,reconnect=true表示启用重连。未设置该参数时默认不重连。 |
| WebSocket协议设置底层自动重连相关的参数:interval=参数值 | interval为重试时间间隔,单位为毫秒。例如interval=10000表示重试间隔为10秒;未设置时默认为1秒,即interval=1000。 |
| WebSocket协议设置底层自动重连相关的参数:payload=参数值 | payload为WebSocket重连时需要发送的订阅消息,例如:payload=okok。 |
| socks5代理的相关参数:proxy=参数值 | proxy用于设置ss5代理,参数值格式为:socks5://name:pwd@192.168.0.1:1080,其中name为ss5服务端用户名,pwd为ss5服务端登录密码,1080为ss5服务的端口。 |
Dial()函数仅支持实盘。
使用Dial函数连接数据库时,连接字符串的编写可参考各数据库的Go语言驱动项目。
| 支持的数据库 | 驱动项目 | 连接字符串(Connection String) | 备注 |
|---|
| sqlite3 | github.com/mattn/go-sqlite3 | sqlite3://file:test.db?cache=shared&mode=memory
| sqlite3://前缀表示使用sqlite3数据库,调用示例:Dial("sqlite3://test1.db") |
| mysql |
|---|
| postgres | github.com/lib/pq | postgres://user=postgres dbname=yourdatabase sslmode=disable
password=yourpassword host=localhost port=5432 | -- |
| clickhouse |
|---|
目前仅JavaScript语言支持在Dial函数中使用mqtt、nats、amqp、kafka通信协议。以下以JavaScript语言的策略代码为例,展示mqtt、nats、amqp、kafka四种协议的使用示例:
javascript
// 需要先配置并部署完成各个协议的代理服务器
// 为便于演示,主题test_topic的订阅(read操作)与发布(write操作)均在当前策略中进行
var arrConn = []
var arrName = []
function main() {
LogReset(1)
conn_nats = Dial("nats://admin@127.0.0.1:4222?topic=test_topic")
conn_mqtt = Dial("mqtt://127.0.0.1:1883?topic=test_topic")
conn_amqp = Dial("amqp://q:admin@127.0.0.1:5672/?queue=test_Queue")
conn_kafka = Dial("kafka://localhost:9092/test_topic")
arrConn = [conn_nats, conn_amqp, conn_mqtt, conn_kafka]
arrName = ["nats", "amqp", "mqtt", "kafka"]
while (true) {
for (var i in arrConn) {
var conn = arrConn[i]
var name = arrName[i]
// 写数据
conn.write(name + ", time: " + _D() + ", test msg.")
// 读数据
var readMsg = conn.read(1000)
Log(name + " readMsg: ", readMsg, "#FF0000")
}
Sleep(1000)
}
}
function onexit() {
for (var i in arrConn) {
arrConn[i].close()
Log("关闭", arrName[i], "连接")
}
}
Dial函数在访问Websocket接口时,支持设置wss请求头:
javascript
let options = {"headers": {"Authorization": "Bearer token123"}}
let conn = Dial("wss://api.example.com/ws", options)
python
options = {"headers": {"Authorization": "Bearer token123"}}
conn = Dial("wss://api.example.com/ws", options)
c++
// 暂不支持