美文网首页
【动手项目二】用nanomsg代替传统的TCP Socket是什

【动手项目二】用nanomsg代替传统的TCP Socket是什

作者: cymatics | 来源:发表于2017-07-09 12:13 被阅读1427次

    今日无事

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

    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是什

          本文链接:https://www.haomeiwen.com/subject/zmushxtx.html