1、cpp文件
#include"acsy/monitor/stock_data.h"
#include<avhttp/avhttp.hpp>
#include"acsy/util/publictools.h"
#include<fstream>
#include<json/json.h>
#include<boost/asio/io_service.hpp>
#include<vector>
namespace acsy
{
namespace monitor
{
StockData::StockData() :m_mem(0)
{
}
StockData::~StockData()
{
}
int StockData::main()
{
std::string aa = "aa";
std::cout << aa << std::endl;
return 0;
}
Json::Value StockData::deal_request(std::vector<std::string> vec_secucode, Json::Value &jv)
{
boost::asio::io_service io;
avhttp::http_stream h(io);
boost::system::error_code ec;
std::string link = "http://hq.sinajs.cn/list="; //"http://qt.gtimg.cn/q=sz000858"
std::string temp;
std::vector<std::string> vec_temp;
for (int i = 0; i < vec_secucode.size(); i++)
{
int stockNum = atoi(vec_secucode[i].c_str());
if (vec_secucode[i].length() < 6)
{
return jv;
}
else if (stockNum < 600000)
{
temp = "sz" + vec_secucode[i] + ",";
}
else if (stockNum >= 600000)
{
temp = "sh" + vec_secucode[i] + ",";
}
link += temp;
}
h.open(link, ec);
if (ec)
{ // 打开失败处理...
std::cout << "Error: " << ec.message() << std::endl;
return jv;
}
char buf[512];
std::stringstream ss;
while (!ec)
{
// h.async_read_some(boost::asio::buffer(buf), boost::bind(&m_dwload.handle_read, this, boost::asio::placeholders::bytes_transferred, boost::asio::placeholders::error));
std::size_t bytes_transferred = h.read_some(boost::asio::buffer(buf, 511), ec);
buf[bytes_transferred] = '\0';
// std::cout << buf << std::endl;
ss << buf;
}
parse(ss);
for (int i = 0; i < m_vec.size(); i++)
{
jv[m_vec[i].code]["price"] = m_vec[i].priceNow;
jv[m_vec[i].code]["priceYest"] = m_vec[i].priceYest;
}
h.close(ec); // 关闭.
io.run();
return jv;
}
void StockData::parse(std::stringstream &ss)
{
CodePrice cp;
std::string convertss;
std::vector < std::string> vec_stinfo;
while (std::getline(ss, convertss))
{
acsy::util::StringSpliter::splitAll(convertss, ',', &vec_stinfo);
int temp = atoi(vec_stinfo[3].c_str());
if (temp == 0)
{
cp.priceNow = vec_stinfo[2];
}
else{
cp.priceNow = vec_stinfo[3];
}
cp.code = vec_stinfo[0].substr(13, 6);
cp.priceYest = vec_stinfo[2];
m_vec.push_back(cp);
vec_stinfo.clear();
}
}
downloader::downloader(boost::asio::io_service &io, const std::string &url, Json::Value &jv) : m_io_service(io), m_stream(io)
{
for (int i = 0; i < 1024; i++)
{
m_buffer[i] = '\0';
}
m_stream.check_certificate(false);
m_stream.async_open(url,
boost::bind(&downloader::handle_open, this, boost::asio::placeholders::error,std::ref(jv)));
}
downloader::~downloader()
{
std::cout << "over" << std::endl;
};
void downloader::handle_open(const boost::system::error_code &ec, Json::Value &jv)
{
if (!ec)
{
boost::asio::async_read(m_stream, boost::asio::buffer(m_buffer, 1024),
boost::bind(&downloader::handle_read, this,
boost::asio::placeholders::bytes_transferred,
boost::asio::placeholders::error,std::ref(jv)));
}
}
void downloader::handle_read(int bytes_transferred, const boost::system::error_code &ec, Json::Value &jv)
{
if (!ec)
{
m_stream.async_read_some(boost::asio::buffer(m_buffer,1024),
boost::bind(&downloader::handle_read, this, boost::asio::placeholders::bytes_transferred, boost::asio::placeholders::error,std::ref(jv)));
m_ss.write(m_buffer, bytes_transferred);
}
else
{
fanhui(jv);
m_self.reset();
}
return;
}
void downloader::fanhui(Json::Value &jv)
{
CodePrice cp;
std::string convertss;
std::vector < std::string> vec_stinfo;
while (std::getline(m_ss, convertss))
{
if (convertss.size() < 100)
{
return ;
}
acsy::util::StringSpliter::splitAll(convertss, ',', &vec_stinfo);
int temp = atoi(vec_stinfo[3].c_str());
if (temp == 0)
{
cp.priceNow = vec_stinfo[2];
}
else{
cp.priceNow = vec_stinfo[3];
}
cp.code = vec_stinfo[0].substr(13, 6);
cp.priceYest = vec_stinfo[2];
m_vecinfo.push_back(cp);
vec_stinfo.clear();
}
for (int i = 0; i < m_vecinfo.size(); i++)
{
jv[m_vecinfo[i].code]["price"] = m_vecinfo[i].priceNow;
jv[m_vecinfo[i].code]["priceYest"] = m_vecinfo[i].priceYest;
}
// std::string ss=Json::StyledWriter().write(jv);
return ;
}
}
}
/*
CodePrice cp;
std::string convertss;
std::vector < std::string> vec_stinfo;
while (std::getline(m_ss, convertss))
{
acsy::util::StringSpliter::splitAll(convertss, ',', &vec_stinfo);
int temp = atoi(vec_stinfo[3].c_str());
if (temp == 0)
{
cp.priceNow = vec_stinfo[2];
}
else{
cp.priceNow = vec_stinfo[3];
}
cp.code = vec_stinfo[0].substr(13, 6);
cp.priceYest = vec_stinfo[2];
m_vecinfo.push_back(cp);
vec_stinfo.clear();
}
for (int i = 0; i < m_vecinfo.size(); i++)
{
m_jv[m_vecinfo[i].code]["price"] = m_vecinfo[i].priceNow;
m_jv[m_vecinfo[i].code]["priceYest"] = m_vecinfo[i].priceYest;
}
*/
2、.h文件
#ifndef ORDER_STOCK_DATA_H
#define ORDER_STOCK_DATA_H
#include"acsy/util/acsyapplication.h"
#include<vector>
#include<iostream>
#include<json/json.h>
#include<avhttp/avhttp.hpp>
#include<avhttp/http_stream.hpp>
#include<boost/enable_shared_from_this.hpp>
/********************************************************************************************************/
namespace acsy
{
/********************************************************************************************************/
namespace monitor
{
/********************************************************************************************************/
struct CodePrice{
std::string code;
std::string priceYest;
std::string priceNow;
};
/********************************************************************************************************/
class downloader :public boost::enable_shared_from_this<downloader>
{
public:
downloader(boost::asio::io_service &io, const std::string &url,Json::Value &jv);
~downloader();
void handle_open(const boost::system::error_code &ec, Json::Value &jv);
void handle_read(int bytes_transferred, const boost::system::error_code &ec, Json::Value &jv);
void fanhui(Json::Value &jv);
public:
boost::asio::io_service &m_io_service;
avhttp::http_stream m_stream;
char m_buffer[1024];
Json::Value m_jv;
std::vector<CodePrice> m_vecinfo;
std::stringstream m_ss;
// std::string m_strbuf;
std::shared_ptr<downloader> m_self;
};
/********************************************************************************************************/
class StockData :public util::Application < StockData >
{
public:
StockData();
~StockData();
int main();
Json::Value deal_request(std::vector<std::string> vec_secucode, Json::Value &jv);
void parse(std::stringstream &ss);
std::string getappname(){ return "stockdata"; };
public:
int m_mem;
downloader *m_dwload;
Json::Value m_js;
std::vector<CodePrice> m_vec;
};
/********************************************************************************************************/
}
/********************************************************************************************************/
}
/********************************************************************************************************/
#endif
3、调用代码的地方
if (adt - last_stock_data_ > 5 *1* 1000)
{
//StockData *sd = new StockData(); //查询股票价格,同步.
//sd->deal_request(vec_allStockCode, root_["codeNowPrice"]);
//delete sd;
//sd = nullptr;
std::string link = "http://hq.sinajs.cn/list="; // qq请求数据地址 "http://qt.gtimg.cn/q=sz000858" //查询股票价格,异步.
std::string temp; //拼接请求数据的网址.
for (int i = 0; i < vec_allStockCode.size(); i++)
{
int stockNum = atoi(vec_allStockCode[i].c_str());
if (vec_allStockCode[i].length() < 6)
{
return 0;
}
else if (stockNum < 600000)
{
temp = "sz" + vec_allStockCode[i] + ",";
}
else if (stockNum >= 600000)
{
temp = "sh" + vec_allStockCode[i] + ",";
}
link += temp;
}
{
auto dwload = std::make_shared<downloader>(local().svc(), link, root_["codeNowPrice"]);
dwload->m_self = dwload;
}
last_stock_data_ = adt;
}
同步、异步读取股票行情(源代码)
最新推荐文章于 2023-10-11 11:23:37 发布