halo_o_wang |
2017-01-24 12:31 |
Qt5的SocketIO客户端
Socket.IO 实现了实时双向的基于事件的通讯机制。旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制。socket.io解决了实时的通信问题,适合用于消息推送、聊天程序等需要服务器端与客户端实时传输数据的环境。 GitHub上的开源代码,我是基于这个代码实现的
代码下载:代码下载 这个客户端实现的功能很简单,就是程序开始运行之后自动连接至服务器,发送一个“chat message”事件,并把服务器发送的内容显示出来 界面是控制台的,因为我觉得控制台的界面代码相对比较少,更方便阅读,所以就没做UI界面。 另外这个程序的运行需要基于Boost(如果没有安装boost,编译会报错),所以在编译之前要安装boost并在pro文件中增加对boost的依赖。 下面是代码区 头文件
- #include <QObject>
#include "sio_client.h"
using namespace std; using namespace sio;
class SocketIOClient: public QObject { Q_OBJECT public: std::string url="ws://192.168.0.103:3000/"; //服务器的URL地址
client *_io; //定义socket.io的客户端
SocketIOClient(); void Connect(); //连接至服务器 void EmitChatMessage(); //发送数据 void OnNewMessage(std::string const& name,message::ptr const& data,bool hasAck,message::list &ack_resp); //接收数据 };
注:头文件中的那个sio_client.h是github上的代码(链接我在上面已经贴出了),不是系统自带的。 CPP文件
- #include "SocketIOClient.h"
#include <QDebug>
#ifdef WIN32 #define BIND_EVENT(IO,EV,FN) \ do{ \ socket::event_listener_aux l = FN;\ IO->on(EV,l);\ } while(0)
#else #endif
SocketIOClient::SocketIOClient(){
_io=new client(); //定义一个socket.io客户端对象
using std::placeholders::_1; using std::placeholders::_2; using std::placeholders::_3; using std::placeholders::_4;
socket::ptr sock=_io->socket(); BIND_EVENT(sock,"chat message",std::bind(&SocketIOClient::OnNewMessage,this,_1,_2,_3,_4)); //绑定事件,当接收到chat message事件时,执行OnNewMessage函数 } void SocketIOClient::Connect(){ _io->connect(url); } void SocketIOClient::EmitChatMessage(){ QString text="123ABC"; QByteArray bytes = text.toUtf8(); std::string msg(bytes.data(),bytes.length());
_io->socket()->Emit("chat message",msg); //发送"chat message"事件 } void SocketIOClient::OnNewMessage(std::string const& name,message::ptr const& data,bool hasAck,message::list &ack_resp){ //处理接收消息 name位事件名称,data为事件内容 qDebug()<<"事件名:"<<name.data(); qDebug()<<"事件内容:"<<data->get_string().data(); }
main.cpp
- #include <QCoreApplication>
#include "SocketIOClient.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
SocketIOClient *cl=new SocketIOClient(); cl->Connect(); //连接至服务器 cl->EmitChatMessage(); //发送一条消息
return a.exec(); }
qt的socketIO客户端这个东西我琢磨了很长时间才做成功,我把一些心得体会写在了自己的博客中 链接 各位大神发现什么问题还请多多指出
|
|