同步、异步读取股票行情(源代码)

来源:互联网 发布:软件开发工程师怎么样 编辑:程序博客网 时间:2024/06/02 09:18
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;};/********************************************************************************************************/}/********************************************************************************************************/}/********************************************************************************************************/#endif3、调用代码的地方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;}

0 0