基于socket.io的Qt客户端与Nodejs服务端

原创
2016/06/20 08:31
阅读数 2.1K

需求背景 目前好多开发者都有开发移动app的需求,特别对于Qter来说,如果想要自己开发一款产品,那么接入一些即时消息在所难免,而选择好的后端通讯框架还是比较重要,我推荐使用nodejs+socket.io或者websocket来做,当然对于有能力的企业或者个人,你们也可以自己搭建和定义通讯协议

客户端SOCKETIO 首先需要安装websocket模块或者socket.io模块,Qt5.3.x之前是没有提供websocket模块的,不过github上面有一个开源的基于Qt的websocket模块,不久之后被采纳进入了QtSDK当中去了,所以github上面找不到他的身影,不过你仍然可以找到QtSocketIO模块 如果你只想使用Websocket的话,个人建议将其源码或者直接使用高版本的Qt就可以正常使用,当然你也可以使用SocketIO模块,它是基于QWebsocket模块出来的应用层的网络通信库,你可以试着去编译它,当然得5.3以上,具体编译,个人建议使用命令行来处理,这样既方便又很好处理

make clean
qmake
make
make install

当然windows编译和unix编译有些不同,我的经验告诉你,windows下 进入qtsdk的命令行即可成功,而unix需要自己在源码目录新建tests/auto/cmake目录,然后执行以上操作 当然你也可以集成qsocketio源码到你的项目当中。 下面是客户端socketio的实现部分(记得加入C++11的配置):

#include "echoclient.h"
#include <QtSocketIo/QSocketIOClient>
#include <QtCore/QJsonObject>
#include <QtCore/QJsonArray>
#include <QtCore/QDebug>

#define function(args...) [=](args)

EchoClient::EchoClient(QObject *parent) :
    QObject(parent),
    m_client()
{
    QObject::connect(&m_client, SIGNAL(connected(QString)), this, SLOT(connected(QString)));
    QObject::connect(&m_client, SIGNAL(disconnected(QString)), this, SLOT(disconnected(QString)));
    QObject::connect(&m_client, SIGNAL(errorReceived(QString,QString)), this, SLOT(errorReceived(QString,QString)));
    QObject::connect(&m_client, SIGNAL(heartbeatReceived()), this, SLOT(heartbeatReceived()));
    QObject::connect(&m_client, SIGNAL(messageReceived(QString)), this, SLOT(messageReceived(QString)));
}

EchoClient::~EchoClient()
{
}

void EchoClient::open(QUrl url)
{
    m_client.open(url);
}

void EchoClient::messageReceived(QString message)
{
    qDebug() << "Message Received:" << message;
}

void EchoClient::errorReceived(QString reason, QString advice)
{
    qDebug() << "Error received:" << reason << "(advice" << advice << ")";
}

void EchoClient::ackReceived(int messageId, QJsonArray arguments)
{
    qDebug() << "Ack received for message with id" << messageId << "arguments:" << arguments;
}

void EchoClient::connected(QString endpoint)
{
    qDebug() << "Connected to endpoint" << endpoint;
    m_client.emitMessage("REG",
                         QVariantMap({ {"order", "REG"},
                                       {QStringLiteral("host"), QStringLiteral("123456")},
                                       {QStringLiteral("device"),"desktop"},
                                       {QStringLiteral("deviceinfo"),"Toby's Mac Book Pro 13"}}),
                         function(QJsonArray returnValue) {
        qDebug() << "Got reply from event with a json object:" << returnValue;
    });
    m_client.on("news", function(QJsonArray data) {
        qDebug() << "Got event from server with data" << data;
    });
}

void EchoClient::disconnected(QString endpoint)
{
    qDebug() << "Disconnected from endpoint" << endpoint;
}

void EchoClient::heartbeatReceived()
{
    qDebug() << "Received heartbeat";
    m_client.emitMessage("MSG",
                         QVariantMap({ {"order", "MSG"},
                                       {QStringLiteral("id"), QStringLiteral("1234561")},
                                       {QStringLiteral("poster"),"22222"},
                                       {QStringLiteral("deviceinfo"),"Toby's Mac Book Pro 13"}}),
                         function(QJsonArray returnValue) {
        qDebug() << "Got reply from event with a json object:" << returnValue;
    });
}

以上代码可以在QtSocketIO的源码的example中找到,我只是做了一些修改,如果是具体业务建议还是socketio,因为它属于websocket的应用级别的模块。

服务端SOCKETIO socket.io(官网:http://socket.io/)是一个跨平台,多种连接方式自动切换,做即时通讯方面的开发很方便,而且能和expressjs提供的传统请求方式很好的结合,即可以在同一个域名,同一个端口提供两种连接方式:request/response, websocket(flashsocket,ajax…). 关于nodejs的知识,以及配置nodejs环境建议去查阅相关的资料即可。 我们看下服务端的socketio代码 首先服务端也需要socket.io模块,这个模块是一个开源的基于nodejs的模块,可以直接在nodejs模块导入即可使用 以下是服务端片段代码

var io = require('socket.io');//导入socket.io模块
var express = require('express');//导入express服务框架
//创建app这个express实例,以及创建一个服务,一个socketio实例
var app = express(),
 server = require('http').createServer(app) ,
  io = io.listen(server);
//服务监听8000端口
server.listen(8000);
//socketio监听客户端的连接
io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('REG', function (data) {
    console.log("Rec from client REG "+data);
  });
  socket.on('MSG', function (data) {
      console.log("Rec from client MSG "+JSON.stringify(data));
  });
});

以上代码做了简单的注释说明,关于这些模块引入,需要使用到npm的包管理模块,主要用到的是一个package.json的文件,是一个json描述的项目说明

{
    "name": "dev",
    "version": "0.0.1",
    "private": true,
    "scripts": {
        "start": "node app.js"
    },
    "dependencies": {
        "socket.io": "0.9",
        "express":"3.x"
    }
}

服务端首先执行

npm install (主要是运行package.json文件),下载socket.io和express的包

node app.js 或者(npm start(主要是package.json里面的scripts那段指令))

只要客户端连上服务端,就可以进行两端互联互通,你就可以为所欲为

如果有什么问题,可以加网站底部的群进行交流

后续还会写一个nodejs相关的服务端的文章

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部