查看完整版本: [-- Qt5的SocketIO客户端 --]

QTCN开发网 -> Qt代码秀 -> Qt5的SocketIO客户端 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

halo_o_wang 2017-01-24 12:31

Qt5的SocketIO客户端

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

代码下载:代码下载
这个客户端实现的功能很简单,就是程序开始运行之后自动连接至服务器,发送一个“chat message”事件,并把服务器发送的内容显示出来
界面是控制台的,因为我觉得控制台的界面代码相对比较少,更方便阅读,所以就没做UI界面。
另外这个程序的运行需要基于Boost(如果没有安装boost,编译会报错),所以在编译之前要安装boost并在pro文件中增加对boost的依赖。
下面是代码区
头文件
  1. #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文件
  1. #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

  1. #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客户端这个东西我琢磨了很长时间才做成功,我把一些心得体会写在了自己的博客中 链接
各位大神发现什么问题还请多多指出



stlcours 2017-01-25 21:17
非常感谢,有空试试

123xiaohai 2022-05-20 10:44


查看完整版本: [-- Qt5的SocketIO客户端 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled