代码网站及sample:https://socket.io/blog/socket-io-cpp/
本文旨在讲解socketio cpp 基础的收发。
可参考我的另一篇文章:http://blog.csdn.net/m0_37263637/article/details/78207641
Socketio cpp client 编译出来有3个 头文件:
及5个lib:
官方sample可参考文章顶部网址。一个可实现的sample可参考
本人编写了一个类,对应相应连接及方法。即需要一路socket 就new 一个对象。
3个头文件对应到3个类。
sio::client h //整个链接都是通过这个类接口实现。
我们通过client.h 提供API 可以绑定一些回调函数(需在类外 因为在类中没有实例化无法绑定到函数地址, 函数形式参考client.h中接口形式编写)。
当事件发生时会触发相应函数。
h.set_socket_open_listener([&](std::string const& nsp){
cout << "open socket:"<< this << endl;
socketStatus = 1;
networkStatus = 1;
});
// h.set_socket_close_listener(&socket_close);
h.set_socket_close_listener([&](std::string const& nsp){
cout << "close socket:" << this << endl;
socketStatus = 0;
});
h.set_reconnect_listener([&](unsigned test1, unsigned test2){
networkStatus = 0;
});
socket::ptr current_socket = h.socket();//(socket()可带参数)
在sio_socket.h我们可以找到
typedef std::function event_listener_aux;
void on(std::string const& event_name,event_listener_aux const& func);
我们按照这个形式编写回调函数。我们可以将回调函数单独编写,但为了能让类内访问,我们以匿名函数的形式编写回调函数
current_socket->on("basic0", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck, message::list &ack_resp)
{
if(isAck){
string msg = "{\"result\":\"success\"}";
ack_resp.push(msg);
}
r_lock.lock();
if (sio::message::flag_integer == data->get_flag()) {
printf("int:%ld\n", data->get_int());
}
else if (sio::message::flag_double == data->get_flag()) {
printf("double:%lf\n", data->get_double());
}
else if (sio::message::flag_string == data->get_flag()) {
readStatus = 1;
receiveBuffer = data->get_string();
}
else if (sio::message::flag_binary == data->get_flag()) {
receiveBuffer = *(data->get_binary());
readStatus = 1;
}
else if (sio::message::flag_object == data->get_flag()) {
printf("get object data\n");
}
else {
printf("unsupport data.\n");
}
r_lock.unlock();
}));
Socketio 通过事件名(即const std::string& name需要发送端和接受端一致)通信,主要处理string型及binary数据。
最后结果被保存在receiveBuffer中,编写了一个read函数通过判断readStatus状态位来判断是否接收到新的数据并处理。
h.connect(url);(可带参数参考client.h)
在sio_socket.h 参数
void emit(std::string const& name, message::list const& msglist = nullptr, std::function
我在头文件中并没有找到网络状态监测的api。但是client中提供了回调借口,我们可以通过lambda表达式,将回调函数写在类中方法内即可(一个类实例对应一个socketio套接字及相应方法),然后通过类中定义标志位变量进行判断。
h.set_socket_open_listener([&](std::string const& nsp){
cout << "open socket:"<< this << endl;
socketStatus = 1;
networkStatus = 1;
});
h.set_socket_close_listener([&](std::string const& nsp){
cout << "close socket:" << this << endl;
socketStatus = 0;
});
h.set_reconnect_listener([&](unsigned test1, unsigned test2){
networkStatus = 0;
});
binary数据格式在socketio中被编写为了std::shared_ptr ptr string型的智能指针。
我们需要将char *data 及 length数据 转换成以下形式用于发送:
std::shared_ptr ptr(new string(data, size));
current_socket->emit(event, ptr, [&](message::list const&data){
ack = data[0]->get_string();
});