依赖库socket.io-client-cpp
实验实现C++socket.io获取数据
#include "string.h"
#include <unistd.h>
#include <iostream>
#include <sio_client.h>
#include <sio_message.h>
#include <sio_socket.h>
#include <string>
#include <iostream>
#include <fstream>
using namespace sio;
using namespace std;
socket::ptr current_socket;
void OnConnect(sio::event &)
{
//不能在OnConnect里emit!
std::cout << "connected \n";
}
void OnMessage_deal_example(const std::string& name, message::ptr const& data, bool isAck, message::list& ack_resp)
{
static int i=0;
printf("23132213123123\r\n");
std::cout<<"[SOCKET.IO]OnMessage_deal_example:" << name <<std::endl;
if(isAck)
{
std::string msg = "{success}";
ack_resp.push(msg);
}
if (sio::message::flag_integer == data->get_flag())
{
std::cout<< "int:" << data->get_int() <<std::endl;
}
else if (sio::message::flag_double == data->get_flag())
{
std::cout<< "double:%lf\n" << data->get_double() <<std::endl;
}
else if (sio::message::flag_string == data->get_flag())
{
std::cout<< "string:" << data->get_string() <<std::endl;
}
else if (sio::message::flag_binary == data->get_flag())
{
std::cout<<"[SOCKET.IO]binary!"<<std::endl;
}
else if (sio::message::flag_object == data->get_flag())
{
std::cout<<"[SOCKET.IO]object!"<<std::endl;
/* 以解析消息内容为: {“deviceIds”:“test12345”}为例 */
std::map<std::string, message::ptr> MessageObject;
map<std::string, message::ptr>::iterator iter;
MessageObject = data->get_map();
iter = MessageObject.find("img");
if(iter != MessageObject.end())
{
if (sio::message::flag_string == iter->second->get_flag())
{
std::cout<< "img:" << iter->second->get_string() <<std::endl;
std::string img_data=iter->second->get_string();
/*string img_data0=base64_decode(img_data);
std::cout<< "img_data:" << img_data <<std::endl;
char buf[100]={0};
sprintf(buf,"aa%d.jpg",i);
std::ofstream fout(buf, std::ios::binary);
fout.write(img_data0.c_str(), img_data0.size());
fout.close();*/
i++;
}
else
{
std::cout<< "[SOCKET.IO]unsupport data type:" << iter->second->get_flag() <<std::endl;
}
iter = MessageObject.find("fullHeight");
if (sio::message::flag_integer == iter->second->get_flag())
std::cout<< "fullHeight:" << iter->second->get_int() <<std::endl;
iter = MessageObject.find("frameCount");
if (sio::message::flag_integer == iter->second->get_flag())
std::cout<< "frameCount:" << iter->second->get_int() <<std::endl;
}
else
{
std::cout<<"[SOCKET.IO]Do not Find browse" <<std::endl;
}
}
else
{
std::cout<<"[SOCKET.IO]unsupport data type!"<<std::endl;
}
}
void OnTargetChanged(sio::event& ev)
{
std::cout << "OnTargetChanged \n";
//接收消息
const sio::message::list message_received = ev.get_message();
std::cout << message_received.size() << std::endl;
//必须转成特定类型的消息
std::cout << message_received[0]->get_string() << std::endl;
//其他消息里可以emit
// message::list li("{\"url\":\"http://192.168.25.246:9020\"}");
// li.push(string_message::create("economics"));
// current_socket->emit("browse", li);
}
int main()
{
sio::client h;
h.connect("ws://192.168.22.82:4000");//连接服务器
current_socket = h.socket();
current_socket->on("connect", &OnConnect);
current_socket->on("image", &OnMessage_deal_example);//接收数据
//"{\"url\":\"http://192.168.25.246:9020\"}"
//如果需要在连接时发送消息,需要在connect外面emit
std::string msg("http://192.168.25.246:9020");//out
message::list para("{url:http://192.168.25.246:9020}");//"{url:http://192.168.25.246:9020}"
current_socket->emit("browse", msg);
//current_socket->on("connect", &OnMessage);
std::cout << "Hello World!\n";
while (true) {
sleep(1);
}
h.sync_close();
h.clear_con_listeners();
return 0;
}