# 服务器交互函数

## `checkConnected()`

声明：function

检查是否和服务器已连接。已连接返回 `true`，否则返回 `false`

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 判断 检查 客户端 本地调用 -->

返回：boolean

### 示例

范例01：确认断开连接后的状态

先主动断开连接，使结果不依赖脚本启动前的连接状态。

```tsl
disconnectServer();
return checkConnected();
// 输出：false
```

## `checkLogined()`

声明：function

检查是否已经登录上服务器。已登录返回 `true`，否则返回 `false`

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 判断 检查 客户端 本地调用 -->

返回：boolean

### 示例

范例01：确认断开连接后的登录状态

先主动断开连接，使结果不依赖脚本启动前的登录状态。

```tsl
disconnectServer();
return checkLogined();
// 输出：false
```

## `connectServer(address, port[, proxy_info])`

声明：function

连接服务器。成功返回 `0`，否则返回错误代码

<!-- tags: 服务器交互函数 连接 登录 -->

| 参数         | 类型    | 说明                                                             |
| ------------ | ------- | ---------------------------------------------------------------- |
| `address`    | string  | 服务器地址。                                                     |
| `port`       | integer | 服务器端口。                                                     |
| `proxy_info` | array   | 可选。省略时不使用代理服务器；代理服务器信息使用字符串下标数组。 |

`proxy_info` 支持以下字符串下标：

| 下标       | 类型    | 说明                                   |
| ---------- | ------- | -------------------------------------- |
| `Address`  | string  | 代理服务器地址。                       |
| `Port`     | integer | 代理服务器端口。                       |
| `User`     | string  | 代理服务器用户名。                     |
| `Password` | string  | 代理服务器密码。                       |
| `AuthMode` | integer | 代理模式：`0` 为 HTTP，`5` 为 SOCKS5。 |

返回：integer

### 示例

范例01：直接连接服务器

以下示例要求目标服务器可连接；连接成功时返回 `0`。

```tsl
connect_result := connectServer("tsl.tinysoft.com.cn", 443);
if connect_result = 0 then
    disconnectServer();
return connect_result;
// 输出：0
```

范例02：通过 HTTP 代理连接

将代理地址和端口替换为可用配置；连接成功时返回 `0`。

```tsl
connect_result := connectServer("tsl.tinysoft.com.cn", 443,
    array("Address": "192.168.0.250", "Port": 808, "AuthMode": 0));
if connect_result = 0 then
    disconnectServer();
return connect_result;
// 输出：0
```

## `defaultConnectAndLogin(alias[, err_msg])`

声明：function

连接并登录服务器。成功返回 `0`，否则返回错误代码

<!-- tags: 服务器交互函数 连接 登录 -->

| 参数      | 类型   | 说明                                                             |
| --------- | ------ | ---------------------------------------------------------------- |
| `alias`   | string | 服务器别名，其相应的配置在INI中。配置可参考：INI文件配置登陆信息 |
| `err_msg` | string | 可选。登录失败时接收错误信息。                                   |

返回：integer

### 示例

范例01：使用 INI 别名连接并登录

以下示例要求在 `tslclient.ini` 中配置可用的 `test` 别名。

```tsl
login_result := defaultConnectAndLogin("test", err_msg);
if login_result = 0 then
    disconnectServer();
return login_result;
// 输出：0
```

## `disconnectServer()`

声明：function

断开服务器。成功断开返回 `0`

<!-- tags: 服务器交互函数 -->

返回：integer

### 示例

范例01：断开当前连接

```tsl
return disconnectServer();
// 输出：0
```

## `endExecute(exec_handle)`

声明：function

终止异步执行或者订阅。有效异步句柄成功终止返回 `0`；无效句柄返回 `0`

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 客户端 本地调用 -->

| 参数          | 类型    | 说明                          |
| ------------- | ------- | ----------------------------- |
| `exec_handle` | integer | 由SendExecute返回的执行句柄。 |

返回：integer

### 示例

范例01：终止异步执行

以下示例要求脚本已登录服务器，以便取得有效的异步执行句柄。

```tsl
remote_exec := "program ServerExample; begin end.";
callback_code := "echo 'server_example_done';";
exec_handle := sendExecute(remote_exec, getSysParams(), callback_code, true);
stop_result := -1;
if exec_handle <> 0 then
    stop_result := endExecute(exec_handle);
return stop_result;
// 输出：0
```

## `getComputebitsOption()`

声明：function

获取使用的计算的位选项。`0` 表示自动选择，`1` 表示 32 位服务器，`2` 表示 64 位服务器

<!-- tags: 服务器交互函数 获取 查询 -->

返回：byte

### 示例

范例01：读取计算位选项

```tsl
old_option := getComputebitsOption();
setComputebitsOption(1);
current_option := getComputebitsOption();
setComputebitsOption(old_option);
return current_option;
// 输出：1
```

## `getComputeService()`

声明：function

获取计算的服务群选择。空字符串表示默认服务，`'auto'` 表示自动选择，否则为指定的服务群名

<!-- tags: 服务器交互函数 获取 查询 -->

返回：string

### 示例

范例01：读取计算服务群

```tsl
old_service := getComputeService();
setComputeService("auto");
current_service := getComputeService();
setComputeService(old_service);
return current_service;
// 输出："auto"
```

## `loginedUser()`

声明：function

获取登录的用户名。未登录时返回空字符串

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 获取 查询 客户端 本地调用 -->

返回：string

### 示例

范例01：读取断开连接后的登录用户名

先主动断开连接，使返回值固定为空字符串。

```tsl
disconnectServer();
return loginedUser();
// 输出：""
```

## `loginServer(user_name, password[, var err_msg])`

声明：function

登录服务器。成功返回 `0`，否则返回错误代码

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 连接 登录 客户端 本地调用 -->

| 参数        | 类型   | 说明                           |
| ----------- | ------ | ------------------------------ |
| `user_name` | string | 字符串类型，登录用户名。       |
| `password`  | string | 字符串类型，登录密码。         |
| `err_msg`   | string | 可选。登录失败时接收错误信息。 |

返回：integer

### 示例

范例01：使用脚本参数登录

以下示例要求将有效的用户名和密码作为前两个脚本参数传入。

```tsl
login_result := -2;
if sysParamcount() >= 2 then
begin
    connect_result := connectServer("tsl.tinysoft.com.cn", 443);
    if connect_result = 0 then
    begin
        login_result := loginServer(sysParamStr(1), sysParamStr(2), err_msg);
        disconnectServer();
    end
    else
    begin
        login_result := connect_result;
    end
end
return login_result;
// 输出：0
```

## `remoteAddress()`

声明：function

第三方交互中得到远程登录的地址。未连接时返回空字符串

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 客户端 本地调用 -->

返回：string

### 示例

范例01：在 TSL 中读取断开连接后的服务器地址

先主动断开连接，使返回值固定为空字符串。

```tsl
disconnectServer();
return remoteAddress();
// 输出：""
```

范例02：Python 交互

```python
import sys

sys.path.append('D:\\tinysoft\\Analyse.NET\\')
import TSLPy3 as ts

login_result = ts.DefaultConnectAndLogin("test")
print(ts.Logined())
print("远程登录地址", ts.RemoteAddress())
print("服务器设置:", ts.GetService())
ts.SetComputeBitsOption(64)  # 设置计算单位
print("计算位数设置:", ts.GetComputeBitsOption())
ts.Disconnect()  # 断开连接
```

打印内容取决于 `test` 别名配置和服务器状态。

## `remotePort()`

声明：function

获取远程端口

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 获取 查询 客户端 本地调用 -->

返回：integer

### 示例

范例01：读取断开连接后的服务器端口

先主动断开连接，使返回值固定为 `0`。

```tsl
disconnectServer();
return remotePort();
// 输出：0
```

## `sendExecute(remote_exec, sys_param, call_back[, online = true])`

声明：function

递交请求给服务器异步执行；成功返回和服务器通讯的句柄，`0` 表示错误

<!-- tags: 服务器交互函数 发送 提交 -->

| 参数          | 类型    | 说明                                                                                                        |
| ------------- | ------- | ----------------------------------------------------------------------------------------------------------- |
| `remote_exec` | string  | 递交远程的执行串，Program 开始 end结束。                                                                    |
| `sys_param`   | array   | 缺省的服务器系统环境参数。                                                                                  |
| `call_back`   | string  | 当执行结束或者出错等等回调的TSL语言代码。                                                                   |
| `online`      | boolean | 可选。默认 `true`，在线执行；为 `false` 时委托执行，结果存入 `sys_param` 中 `resultname` 指定的用户数据表。 |

返回：integer

实时行情订阅调用形式为 `sendExecute("", order_param, call_back, false)`。

| 参数          | 类型   | 说明                                                                  |
| ------------- | ------ | --------------------------------------------------------------------- |
| `order_param` | array  | 订阅请求参数，使用下表所列的字符串下标。                              |
| `call_back`   | string | 实时数据到达、订阅结束或出错时执行的 TSL 回调代码；信息位于系统参数。 |

`order_param` 的下标：

| 下标   | 类型    | 说明                                       |
| ------ | ------- | ------------------------------------------ |
| `Type` | integer | 必需。订阅类型，`1` 表示行情订阅。         |
| `IDs`  | array   | 必需。订阅 ID 数组；行情订阅时为股票列表。 |
| `SUBs` | array   | 行情订阅必需。指定订阅字段。               |

普通行情支持的 `SUBs` 字段：`StockID`、`StockName`、`date`、`price`、`open`、`close`、`high`、`low`、`vol`、`amount`、`cjbs`、`yclose`、`syl1`、`syl2`、`lb`、`buy1` 至 `buy5`、`sale1` 至 `sale5`、`bc1` 至 `bc5`、`sc1` 至 `sc5`。

Level2 行情还支持：`buy6` 至 `buy10`、`sale6` 至 `sale10`、`bc6` 至 `bc10`、`sc6` 至 `sc10`。

### 示例

范例01：异步提交远程脚本

以下示例要求脚本已登录服务器；成功取得句柄时返回 `true`。

```tsl
remote_exec := "program ServerExample; begin end.";
callback_code := "echo 'server_example_done';";
exec_handle := sendExecute(remote_exec, getSysParams(), callback_code, true);
submitted := exec_handle > 0;
if submitted then
    endExecute(exec_handle);
return submitted;
// 输出：true
```

范例02：订阅实时行情后立即结束

以下示例要求脚本已登录服务器并具备行情权限；成功取得句柄时返回 `true`。

```tsl
order_param := array(
    "Type": 1,
    "IDs": array("SH000001"),
    "SUBs": array("StockID", "price"));
callback_code := "echo 'server_quote_update';";
exec_handle := sendExecute("", order_param, callback_code, false);
subscribed := exec_handle > 0;
if subscribed then
    endExecute(exec_handle);
return subscribed;
// 输出：true
```

## `sendExecuteAndWait(remote_exec, sys_param, var exec_result, var env_or_err[, online = true])`

声明：function

递交请求给服务器执行。成功返回 `0`，否则返回错误代码

<!-- tags: 服务器交互函数 发送 提交 -->

| 参数          | 类型    | 说明                                                                                                        |
| ------------- | ------- | ----------------------------------------------------------------------------------------------------------- |
| `remote_exec` | string  | 递交远程的执行串，以 `Program` 开始、`end.` 结束。                                                          |
| `sys_param`   | array   | 服务器系统环境参数。                                                                                        |
| `exec_result` | any     | 接收远程执行结果。                                                                                          |
| `env_or_err`  | any     | 执行成功时接收辅助结果；执行失败时接收错误信息。辅助结果由模型通过 `env_return` 系统参数设置。              |
| `online`      | boolean | 可选。默认 `true`，在线执行；为 `false` 时委托执行，结果存入 `sys_param` 中 `resultname` 指定的用户数据表。 |

返回：integer

### 示例

范例01：同步执行远程脚本

以下示例要求脚本已登录服务器。

```tsl
remote_exec := "program ServerExample; begin return 7; end.";
status := sendExecuteAndWait(
    remote_exec, getSysParams(), exec_result, env_or_err, true);
if status = 0 then
    example_result := exec_result;
else
    example_result := env_or_err;
echo example_result;
// 输出：7
```

## `setComputebitsOption(v)`

声明：function

设置使用的计算的位选项。返回修改前的设置选项

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 设置 修改 客户端 本地调用 -->

| 参数 | 类型 | 说明                                                         |
| ---- | ---- | ------------------------------------------------------------ |
| `v`  | byte | 整数。0表示自动选择，1表示32位服务器计算 2表示64位服务器计算 |

返回：byte

### 示例

范例01：设置计算位数并恢复原值

```tsl
old_option := getComputebitsOption();
setComputebitsOption(1);
current_option := getComputebitsOption();
setComputebitsOption(old_option);
return current_option;
// 输出：1
```

## `setComputeService(service)`

声明：function

设置使用的计算的服务群。设置成功返回 `0`

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 设置 修改 客户端 本地调用 -->

| 参数      | 类型   | 说明                                                                          |
| --------- | ------ | ----------------------------------------------------------------------------- |
| `service` | string | 服务群名。空字符串表示默认服务，`'auto'` 表示自动选择，否则为指定的服务群名。 |

返回：integer

### 示例

范例01：设置自动选择并恢复原值

```tsl
old_service := getComputeService();
setComputeService("auto");
current_service := getComputeService();
setComputeService(old_service);
return current_service;
// 输出："auto"
```

## `tsTaskAdmin(command, var cmd_return, broad_cast_msg, err_msg[, wait_ms, data_recved_wait_ms])`

声明：function

向天软平台发送管理命令。本地函数调用时需要加上 RDO2。成功返回 `0`，结果通过 `cmd_return` 和 `broad_cast_msg` 输出

调用位置：本地客户端或本地解释器；不要放入远端计算脚本执行。

<!-- tags: 服务器交互函数 RDO2 客户端 本地调用 -->

| 参数                  | 类型    | 说明                                                            |
| --------------------- | ------- | --------------------------------------------------------------- |
| `command`             | string  | 字符串类型，送入的命令串。更多任务管理命令查看：Q：任务管理说明 |
| `cmd_return`          | string  | 输出参数，接收命令执行结果。                                    |
| `broad_cast_msg`      | string  | 输出参数，接收命令期间收到的广播消息。                          |
| `err_msg`             | string  | 输出参数，发生错误时接收错误信息。                              |
| `wait_ms`             | integer | 可选。等待信息的毫秒数。                                        |
| `data_recved_wait_ms` | integer | 可选。收到数据后继续等待多少毫秒再结束。                        |

返回：integer

### 示例

范例01：发送任务管理命令

以下示例要求脚本已登录服务器。`oa` 命令无管理结果时，`cmd_return` 为 `0`。

```tsl
rdo2 tsTaskAdmin("oa", cmd_return, broad_cast_msg, err_msg, 3000, 1000);
return cmd_return;
// 输出：0
```
