论坛博客怎么啦,半夜还不让写博客啦?

寒山-居士 2014-04-21 11:24:11
Node.Js现在很火?是的,它现在属于后台服务器比较火的方案之一,废话不多说,想了解nodejs自己google去查查,基于javascript的后台服务器框架
最近要做PC客户端的IM工作,而恰好后端使用的nodejs的,做即时通讯等功能,对于nodejs来说应该是绰绰有余,单线程下的高并发,适合创业公司学习。
今天上午本来打算使用Qt下面的QTcpSocket来与后端socket.io建立链接,不曾想,简单的socket链接 是无法满足于现状,于是乎,网上找,群内问,终于找到了基于Qt下面的websocket的例子,可惜我现在Qt版本是5.2.1,但是Qt5.3已经将websocket模块集成到啦Qt框架里面啦,真是蛋疼的不得不用最新的,本来想使用QWebsocket源码进行编译,然后与QSocketIO源码进行编译成可用的动态库,但是不曾想,里面的坑太多,只得安装新的Qt5.3Beta包,才得以用之。
现在主要说下QSocketIO的开源代码,代码地址:QSocketIO,老外写的开源的东东,分享精神不错,还是有QWebsocket这个本来是他开源的,后来直接被Qt收录囊中,直接集成到模块,Qt真是个大杂烩,集开源代码于一身。
要使用socket.io QSocketIO已经有例子告诉你如何写。
简单说下Qt部分

#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("event with 2 arguments",
QVariantList() << 1 << QStringLiteral("Hello socket.io,I am Qter"),
function(QJsonArray returnValue) {
qDebug() << "Got reply from event with 2 arguments:" << returnValue;
});
m_client.emitMessage("event with a json object",
QVariantMap({ {"number", 1}, { QStringLiteral("message"), QStringLiteral("Hello socket.io")}}),
function(QJsonArray returnValue) {
qDebug() << "Got reply from event with a json object:" << returnValue;
});
m_client.on("event from server", 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("event with a json object",
QVariantMap({ {"number", 1}, { QStringLiteral("message"), QStringLiteral("Hello socket.io")}}),
function(QJsonArray returnValue) {
qDebug() << "Got reply from event with a json object:" << returnValue;
});
}
创建了一个wssocket连接,connect到服务器,同时也向服务器发送了一些数据,connect(QString str);里面还使用了回调函数,可以拿到服务器给出的应答
再者我们看下nodejs部分
首先需要安装nodejs模块
mac osx下面可以使用brew这个包管理工具 类似linux下面的apt工具 windows需要安装nodejs安装包
mac 下面 可以直接brew install nodejs,直接可以给你解决各种依赖关系
但是nodejs下面需要使用npm install socket.io 来安装socket.io模块
var io = require('socket.io').listen(8001, {
"log": false,
"close timeout": 30
});

io.sockets.on('connection', function(socket) {
socket.emit('news', 1, 'world', function(data) {
console.log("Message was delivered.");
});
socket.on('event with 2 arguments', function(data1, data2,callback) {
console.log('Received event with arguments:' + data1 + " and " + data2);

//setTwoarg();
function setTwoarg()
{
if (callback) {
callback("Okay received your event with 2 arguments");
}
}
setTimeout(setTwoarg,2000);
});
socket.on('event with a json object', function(object, callback) {
console.log('Received event with object:' + JSON.stringify(object));
if (callback) {
callback("Okay received your json object.");
}
});
socket.emit("event from server", {"attribute1" : "hello", "attribute2": "world!"});
});
这里是nodejs代码
代码就创建了一个socket.io的服务,socket.on是监听客户端的链接,而emit是发送数据出去
socket.io接口如何使用可以参考socket.io网站
Qt部分写好后,在终端运行node server.js 然后客户端启动就可以链接服务器,做各种操作啦。
各位可以畅游服务器与客户端之间
晚安
...全文
151 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
unituniverse2 2014-04-22
  • 打赏
  • 举报
回复
引用 2 楼 Esonpo 的回复:
为什么会出现这种情况,能否解释下???
是不是值夜班的人偷懒,为了省麻烦干脆禁用所有修改权限然后睡觉去了? 或者晚上根本没人。。。。
寒山-居士 2014-04-22
  • 打赏
  • 举报
回复
呵呵 这个是Qt开源代码里面是这样写的
FrankHB1989 2014-04-22
  • 打赏
  • 举报
回复
#define function(args...) [=](args) 为什么要使用可读性更差的写法。
kuankuan_qiao 2014-04-22
  • 打赏
  • 举报
回复
施主 息怒息怒
寒山-居士 2014-04-22
  • 打赏
  • 举报
回复
到现在还是不能发布,尼玛 逼我离开csdn么?
寒山-居士 2014-04-22
  • 打赏
  • 举报
回复
为什么会出现这种情况,能否解释下???
寒山-居士 2014-04-22
  • 打赏
  • 举报
回复
不知道程序员都是晚上出动么?
derekrose 2014-04-21
  • 打赏
  • 举报
回复
代表csdn技术组向你表示歉意

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧