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

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;
	}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值