
# WebSocket 数据流

WebSocket是HTML5一种新的协议(Protocol)。它实现了客户端与服务器全双工通信， 使得数据可以快速地双向传播。通过一次简单的握手就 可以建立客户端和服务器连接， 服务器根据业务规则可以主动推送信息给客户端。其优点如下：

- 客户端和服务器进行数据传输时，请求头信息比较小，大概2个字节。

- 客户端和服务器皆可以主动地发送数据给对方。

- 不需要多次创建TCP请求和销毁，节约宽带和服务器的资源。

- 强烈建议开发者使用WebSocket API获取市场行情和买卖深度等信息。


| 域名	     | WebSocket API                         | 建议使用      |
|---------|---------------------------------------|-----------|
| 公共频道    | wss://ws-spot.weex.com/v3/ws/public  | 生产环境，公共频道 |
| 私有频道    | wss://ws-spot.weex.com/v3/ws/private | 生产环境，私有频道 |



## 连接

连接说明：

- 连接限制：300次连接请求/IP/5分钟，单个IP最多可以创建20个连接

- 订阅限制：240次/小时/连接，单个连接最多可以订阅100个频道

- 公有频道连接限制：公有频道连接的时候需要头信息(User-Agent)

- 私有频道连接限制：私有频道连接的时候需要头信息

- 为了保持连接有效且稳定，建议您进行以下操作：

- WebSocket连接成功之后，Server端会以固定频率向Client端发送Ping消息。公有频道消息体为：`{"event":"ping","time":"1693208170000"}`；私有频道消息体为：`{"type":"ping","time":"1693208170000"}`。其中time标示的是Server端Ping时刻的时间戳。Client端收到任一Ping消息后，请回复相同的Pong消息，消息体内容为 `{"method":"PONG","id":1}`。超过10次不回应，服务端会主动断开当前连接。

## 私有频道连接需要的头信息

**User-Agent**:Client identification

**ACCESS-KEY**:用于调用API的用户身份唯一标示，需要用户申请

**ACCESS-PASSPHRASE**:API Key 的密码

**ACCESS-TIMESTAMP**: 时间戳 是Unix Epoch时间，单位是毫秒， 时间戳30秒后会过期，必须跟签名的timestamp保持一致

**ACCESS-SIGN**:为签名字符串，签名规则参照如下:

Message即(待签名字符串)为： timestamp+requestPath

其中timestamp示例(取毫秒):

`const timestamp = '' + Date.now()`

requestPath 为 `/v3/ws/private`


<strong>生成最终签名的步骤</strong>

1. 将待签名字符串使用私钥secretkey进行hmac sha256加密
   - Signature = hmac_sha256(secretkey, Message)
2. 对于Signature进行base64编码
   - Signature = base64.encode(Signature)

## 订阅

订阅说明

请求中的id被用作唯一标识来区分来回传递的消息

```json
{
  "method": "SUBSCRIBE",
  "params": ["BTCUSDT@ticker", "BTCUSDT@depth15"],
  "id": 1
}
```


## 取消订阅

取消订阅说明

```json
{
  "result": true,
  "id": 1
}
```
