socketio-cpp-lib使用

来源:互联网 发布:周易取名软件破解版 编辑:程序博客网 时间:2024/05/24 04:53

SocketIo cpp lib 使用

代码网站及sample:https://socket.io/blog/socket-io-cpp/

本文旨在讲解socketio cpp 基础的收发。

1 编译socketio 得到lib和头文件。

可参考我的另一篇文章:http://blog.csdn.net/m0_37263637/article/details/78207641

Socketio cpp client 编译出来有3个 头文件:

  • Sio_client.h
  • Sio_message.h
  • Sio_socket.h

及5个lib:

  • libboost_date_time.a
  • libboost_random.a
  • libboost_system.a
  • libsioclient_tls.a
  • libsioclient.a

2 使用介绍及部分api讲解。

官方sample可参考文章顶部网址。一个可实现的sample可参考

本人编写了一个类,对应相应连接及方法。即需要一路socket 就new 一个对象。

3个头文件对应到3个类。

1 我们首先的定义一个链接。

sio::client h //整个链接都是通过这个类接口实现。

2.建立监听

我们通过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;    });

3 得到socket() 数据发送接收均是通过该类实现。

socket::ptr current_socket = h.socket();//(socket()可带参数)

4.绑定接收回调函数

在sio_socket.h我们可以找到

typedef std::function<void(const std::string& name,message::ptr const& message,bool need_ack, message::list& ack_message)> 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状态位来判断是否接收到新的数据并处理。

5 链接server

h.connect(url);(可带参数参考client.h)

6 发送数据

在sio_socket.h 参数
void emit(std::string const& name, message::list const& msglist = nullptr, std::function

3 一些细节

1网络状态判断及端口判断:

我在头文件中并没有找到网络状态监测的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;    });

2 关于binary数据接收发送

binary数据格式在socketio中被编写为了std::shared_ptr ptr string型的智能指针。
我们需要将char *data 及 length数据 转换成以下形式用于发送:

std::shared_ptr<const std::string> ptr(new string(data, size)); current_socket->emit(event, ptr, [&](message::list const&data){    ack = data[0]->get_string();});

3.socketio中message.h中提供了相应检测接受数据类型的api。

原创粉丝点击