用C++和websocket来订阅币安aggtrade例子
时间: 2023-08-10 13:53:35 浏览: 161
好的,以下是一个用 C++ 和 WebSocket 订阅币安 aggTrade 的例子:
```c++
#include <iostream>
#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/stringbuffer.h>
using namespace std;
using namespace websocketpp;
typedef client<config::asio_client> client;
class aggTrade_client {
public:
aggTrade_client() {
// 设置连接的 URL
m_endpoint.set_access_channels(websocketpp::log::alevel::none);
m_endpoint.set_error_channels(websocketpp::log::elevel::none);
m_endpoint.init_asio();
}
// WebSocket 连接
void connect(string const& uri) {
websocketpp::lib::error_code ec;
client::connection_ptr con = m_endpoint.get_connection(uri, ec);
if (ec) {
cout << "连接失败: " << ec.message() << endl;
return;
}
con->set_open_handler(bind(&aggTrade_client::on_open, this, ::_1));
con->set_message_handler(bind(&aggTrade_client::on_message, this, ::_1, ::_2));
m_endpoint.connect(con);
m_endpoint.run();
}
private:
client m_endpoint;
websocketpp::connection_hdl m_hdl;
// WebSocket 连接成功回调函数
void on_open(connection_hdl hdl) {
cout << "连接成功!" << endl;
m_hdl = hdl;
// 订阅 aggTrade
rapidjson::StringBuffer s;
rapidjson::Writer<rapidjson::StringBuffer> writer(s);
writer.StartObject();
writer.Key("method");
writer.String("SUBSCRIBE");
writer.Key("params");
writer.StartArray();
writer.String("btcusdt@aggTrade");
writer.EndArray();
writer.Key("id");
writer.Int(1);
writer.EndObject();
m_endpoint.send(hdl, s.GetString(), s.GetSize(), websocketpp::frame::opcode::text);
}
// WebSocket 收到消息回调函数
void on_message(connection_hdl hdl, client::message_ptr msg) {
rapidjson::Document d;
d.Parse(msg->get_payload().c_str());
if (d.HasMember("data")) {
const rapidjson::Value& data = d["data"];
if (data.IsArray()) {
for (rapidjson::SizeType i = 0; i < data.Size(); i++) {
const rapidjson::Value& item = data[i];
if (item.HasMember("a") && item.HasMember("p")) {
double price = item["p"].GetDouble();
double amount = item["q"].GetDouble();
bool is_buyer_maker = item["m"].GetBool();
cout << "价格:" << price << ",数量:" << amount << ",是否是主动成交方:" << (is_buyer_maker ? "是" : "否") << endl;
}
}
}
}
}
};
int main() {
aggTrade_client client;
client.connect("wss://stream.binance.com:9443/ws");
return 0;
}
```
这个例子使用了 WebSocket++ 库来进行 WebSocket 连接,使用了 RapidJSON 库来解析收到的 JSON 格式数据。当连接成功后,会发送一个订阅 aggTrade 的请求,之后收到消息会输出收到的价格、数量和是否是主动成交方等信息。
阅读全文