【动手项目二】用nanomsg代替传统的TCP Socket是什么样的体验?

今日无事

其实我想说,路易十六在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

【动手项目二】用nanomsg代替传统的TCP Socket是什么样的体验?_第1张图片
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);

最后值得一说的是,使用 nanomsg 的话, 服务器和客户端的启动顺序是可以 不分先后哦~

你可能感兴趣的:(【动手项目二】用nanomsg代替传统的TCP Socket是什么样的体验?)