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。
- socketio-cpp-lib使用
- SocketIO --- iOS使用篇
- SocketIO
- socketio
- 找不到源文件lib.cpp
- 360Lib:CPP-PSNR
- 360Lib:CPP
- iOS使用socketIO实现长连接
- 理解dll,lib,cpp,h
- TCustomOutline BCBSMP.LIB cdiroutl.cpp
- vs2010+opencv 使用Microsoft.Cpp.Win32.user配置opencv 依赖的lib的问题
- Gevent-Socketio Module-Socketio
- java|android 使用SocketIO.jar连接nodejs websocket
- Spring Boot使用Netty SocketIO实现WebIM功能
- java|android 使用SocketIO.jar连接nodejs websocket
- socketIO服务器,安卓,js端使用代码
- DragSource Lib for BCB(DragDrop.cpp)
- /lib/cpp fails sanity check的解决
- 利用Eclipse编写minigui的helloworld程序
- 给任何view添加全屏倾斜水印
- JavaScript简单计算器
- Spring Boot 中文乱码解决
- U盘格式化后容量变小了怎么恢复教程
- socketio-cpp-lib使用
- 一种C#读写二进制文件的通用方法
- Minicom 使用初步
- Codeforces 591E Three States【优先队列Bfs+思维】
- Spring Boot自定义PropertySourceLoader
- Zookeeper acl
- 2017找工作总结——机会总是留给有准备的人
- 7.0系统WindowManager使用问题
- Kruscal算法的简单介绍