protocolbuffers 接入方案
合约 WebSocket 同时支持 JSON 与 Protobuf 两种推送格式。使用 Protobuf 时,具体接入流程如下。
使用 PB 格式订阅 wss 地址:
wss://contract.mexc.com/edge?Trans-Protocol=Protobuf
重要区分:
- 客户端上行(订阅、取消订阅、PING):UTF-8 JSON 字符串
- 服务端下行行情推送:原始 Protobuf 二进制 byte 数组(不是 JSON)
1.PB 文件定义 PB 定义文件可以在此连接处获取:https://github.com/mexcdevelop/websocket-future-proto/
2.生成反序列化代码
使用 https://github.com/protocolbuffers/protobuf 工具编译 .proto 文件,生成反序列化代码。
Java
# 在 proto 文件夹下执行
protoc *.proto --java_out=java文件输出路径
Python
# 在 proto 文件夹下执行
protoc *.proto --python_out=python文件输出路径
其他
支持多种语言,包括 C++、C#、Go、Ruby、PHP、JS 等。详见 https://github.com/protocolbuffers/protobuf。
3.数据反序列化 使用编译生成的 pb 代码,对服务端返回的二进制字节进行反序列化。
Java 引入 protobuf-java:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>{protobuf.version}</version><!-- 根据项目实际情况指定版本 -->
</dependency>
解析示例:
// 组装对象
com.mxc.quotation.common.data.vo.pb.Ticker.Builder tickerBuilder =
com.mxc.quotation.common.data.vo.pb.Ticker.newBuilder();
// 序列化为二进制格式
com.mxc.quotation.common.data.vo.pb.Ticker result = tickerBuilder.setSymbol("BTCUSDT")
.build();
byte[] serializedData = result.toByteArray();
// 反序列化为 Ticker 对象
com.mxc.quotation.common.data.vo.pb.Ticker ticker =
com.mxc.quotation.common.data.vo.pb.Ticker.parseFrom(serializedData);
Python
解析示例:
import Ticker_pb2
# 1. 创建 Ticker 对象
ticker = Ticker_pb2.Ticker()
# 2. 给字段赋值
ticker.symbol = "BTCUSDT"
# 3. 序列化为二进制 bytes
serialized_data = ticker.SerializeToString()
# 4. 从二进制 bytes 反序列化
ticker_new = Ticker_pb2.Ticker()
ticker_new.ParseFromString(serialized_data)
订阅一个信息流
订阅
{
"method": "sub.ticker",
"param": {
"symbol": "BTC_USDT"
}
}
取消订阅一个信息流
取消订阅
{
"method": "unsub.ticker",
"param": {
"symbol": "BTC_USDT"
}
}
PING/PONG 机制
订阅
{
"method": "ping"
}
数据示例
{
"channel": "pong",
"data": 1587453241453
}