• 6322阅读
  • 2回复

Qt5的SocketIO客户端 [复制链接]

上一主题 下一主题
离线halo_o_wang
 

只看楼主 倒序阅读 楼主  发表于: 2017-01-24
Socket.IO 实现了实时双向的基于事件的通讯机制。旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制。socket.io解决了实时的通信问题,适合用于消息推送、聊天程序等需要服务器端与客户端实时传输数据的环境。
GitHub上的开源代码,我是基于这个代码实现的

代码下载:代码下载
这个客户端实现的功能很简单,就是程序开始运行之后自动连接至服务器,发送一个“chat message”事件,并把服务器发送的内容显示出来
界面是控制台的,因为我觉得控制台的界面代码相对比较少,更方便阅读,所以就没做UI界面。
另外这个程序的运行需要基于Boost(如果没有安装boost,编译会报错),所以在编译之前要安装boost并在pro文件中增加对boost的依赖。
下面是代码区
文件
  1. #include <QObject>
  2. #include "sio_client.h"
  3. using namespace std;
  4. using namespace sio;
  5. class SocketIOClient: public QObject
  6. {
  7.     Q_OBJECT
  8. public:
  9.     std::string url="ws://192.168.0.103:3000/"; //服务器的URL地址
  10.     client *_io; //定义socket.io的客户端
  11.     SocketIOClient();
  12.     void Connect(); //连接至服务器
  13.     void EmitChatMessage(); //发送数据
  14.     void OnNewMessage(std::string const& name,message::ptr const& data,bool hasAck,message::list &ack_resp); //接收数据
  15. };

注:头文件中的那个sio_client.h是github上的代码(链接我在上面已经贴出了),不是系统自带的。
CPP文件
  1. #include "SocketIOClient.h"
  2. #include <QDebug>
  3. #ifdef WIN32
  4. #define BIND_EVENT(IO,EV,FN) \
  5.     do{ \
  6.         socket::event_listener_aux l = FN;\
  7.         IO->on(EV,l);\
  8.     } while(0)
  9. #else
  10. #endif
  11. SocketIOClient::SocketIOClient(){
  12.     _io=new client(); //定义一个socket.io客户端对象
  13.     using std::placeholders::_1;
  14.     using std::placeholders::_2;
  15.     using std::placeholders::_3;
  16.     using std::placeholders::_4;
  17.     socket::ptr sock=_io->socket();
  18.     BIND_EVENT(sock,"chat message",std::bind(&SocketIOClient::OnNewMessage,this,_1,_2,_3,_4)); //绑定事件,当接收到chat message事件时,执行OnNewMessage函数
  19. }
  20. void SocketIOClient::Connect(){
  21.     _io->connect(url);
  22. }
  23. void SocketIOClient::EmitChatMessage(){
  24.     QString text="123ABC";
  25.     QByteArray bytes = text.toUtf8();
  26.     std::string msg(bytes.data(),bytes.length());
  27.     _io->socket()->Emit("chat message",msg); //发送"chat message"事件
  28. }
  29. void SocketIOClient::OnNewMessage(std::string const& name,message::ptr const& data,bool hasAck,message::list &ack_resp){ //处理接收消息 name位事件名称,data为事件内容
  30.     qDebug()<<"事件名:"<<name.data();
  31.     qDebug()<<"事件内容:"<<data->get_string().data();
  32. }
main.cpp

  1. #include <QCoreApplication>
  2. #include "SocketIOClient.h"
  3. int main(int argc, char *argv[])
  4. {
  5.     QCoreApplication a(argc, argv);
  6.     SocketIOClient *cl=new SocketIOClient();
  7.     cl->Connect(); //连接至服务器
  8.     cl->EmitChatMessage(); //发送一条消息
  9.     return a.exec();
  10. }


qt的socketIO客户端这个东西我琢磨了很长时间才做成功,我把一些心得体会写在了自己的博客中 链接
各位大神发现什么问题还请多多指出


离线stlcours

只看该作者 1楼 发表于: 2017-01-25
非常感谢,有空试试
离线123xiaohai

只看该作者 2楼 发表于: 2022-05-20
快速回复
限100 字节
 
上一个 下一个