今日无事。
其实我想说,路易十六在7月14日的日记里也写的是今日无事
所以,我动手实现了一个小功能。
实现一个端对端通信的程序。一边是数据生产方,不停的生产图片地址和描述信息,一端是数据消费端,从解析到的网络地址下载图片,连同描述信息一块呈现出来。
技术实现:数据消费端是要呈现图片和描述信息的,那就用Qt吧,有空了试试Electron。数据生产端应该是能周期性发数据的,方便性能测试,就选nodejs吧。 对于通信方式的选型,常规方法是QTcpSocket/QTcpServer, 但我一直都想玩nanomsg。要不都实现吧,做参照。
代码见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
用来测试的数据生产端采用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);
最后值得一说的是,使用 nanomsg 的话, 服务器和客户端的启动顺序是可以 不分先后哦~