nanomsg很优秀,Qt也很优秀,今天我尝试把他们粘在一块。

实现一个端对端通信的程序。一边是数据生产方,不停的生产图片地址和描述信息,一端是数据消费端,从解析到的网络地址下载图片,连同描述信息一块呈现出来。

代码见github:https://github.com/cymatics1717/imageSwitcher ,这两个方案分别对应的是master 和nanomsg分支。

  • 使用Qt的QGraphicsView/QGraphicsScene 画图呈现,并用QPropertyAnimation实现了最简单的动画。
  • 下载图片用 QNetworkAccessManager,【网上很多人喜欢为每个请求单开一个线程的做法是很糟糕的】。
  • nanomsg 通信单开一个线程。将backEnd对象 moveToThread即可。【 网上大量的通过派生QThread的方式也是很糟糕的】

图片源都是puffin的各种表情包,show一下:
http://www.stevenround-birdphotography.com/Puffin.htm
image.png

用来测试的数据生产端采用Nodejs实现。正好练练手,玩玩net模块的tcp能力。

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 11111;
var cnt = 1;


var client = new net.Socket();
client.connect(PORT, HOST, function() {
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
client.write('I am wayne, from NodeJS !');
});

client.on('data', function(data) {
console.log('DATA: ' + data);
});

client.on('error', function() {
console.log('error: ' );
client.destroy();
});

client.on('close', function() {
console.log('Connection closed');
});

function intervalFunc() {
data={"url":"","desc":""};
tmp = ("0" + cnt++).slice(-2);
data["url"]="http://www.stevenround-birdphotography.com/source/image/puffin-"
+ tmp +".jpg";
data["desc"] = "from node js"+tmp
client.write(JSON.stringify(data));
console.log('send data: '+JSON.stringify(data));
}

setInterval(intervalFunc, 2000);

对比一下,同样的功能,nanomsg:

var nano = require('nanomsg');


// var rep = nano.socket('rep');
var pair = nano.socket('pair');

var addr = 'tcp://127.0.0.1:11111';
var cnt = 1;

pair.connect(addr);

pair.on('data', function (buf) {
console.log('received response: ', buf.toString());
// req.close();
});

function intervalFunc() {
data={"url":"","desc":""};
tmp = ("0" + cnt++).slice(-2);
data["url"]="http://www.stevenround-birdphotography.com/source/image/puffin-"
+ tmp +".jpg";
data["desc"] = "from node js"+tmp
pair.send(JSON.stringify(data));

console.log('send data: '+JSON.stringify(data));
}

setInterval(intervalFunc, 2000);