美文网首页
node RPC(Remote Procedure Call)

node RPC(Remote Procedure Call)

作者: 努力学习的小丸子 | 来源:发表于2021-02-04 15:11 被阅读0次

    protocol-buffers

    https://www.npmjs.com/package/protocol-buffers

    buffer

    http://nodejs.cn/api/buffer.html#buffer_buf_writebigint64be_value_offset

    tcp之单工通信

    client和server之间,只能是单向的一方向另一方发送数据。

    // client.js
    const net = require('net');
    const socket = new net.Socket();
    socket.connect({port:2000});
    process.stdin.on('data',e=>{
        socket.write(Buffer.from([1,2,3]));
    })
    //server.js
    const net = require('net');
    net.createServer((socket) => {
        socket.on('data',data=>{
          console.log('server,',data,data.toString());
        })
      }).listen(2000,()=>{
        console.log('server is running')
      })
    

    tcp之半双工通信

    client和server,有来有往,如client发送一条消息,收到server响应后,才能发送下一条消息。

    //client.js
    const net = require('net');
    const socket = new net.Socket();
    socket.connect({port:2000});
    let count = 0;
    socket.write(Buffer.from(level()+''));
    socket.on('data',data=>{
        console.log('client,',data,data.toString());
        count++;
        if(count<10){
            socket.write(Buffer.from(level()+''));
        }
    })
    function level(){return Math.floor(Math.random()*(6-1+1))+1};
    //server.js
    const net = require('net');
    net.createServer((socket) => {
        socket.on('data',data=>{
          console.log('server,',data,data.toString());
          if(data){
            socket.write('response');
          }
        })
      }).listen(2000,()=>{
        console.log('server is running')
      })
    

    tcp之全双工通信

    client不停的发送请求,不需等到结果就可以发送下一个请求(需要有一个标识,来匹配请求和响应)
    在一秒之内,server随机时间返回数据,来混淆数据包的顺序

    //client.js
    const net = require('net');
    const socket = new net.Socket();
    socket.connect({port:2000});
    function send(num){
        const buf = Buffer.allocUnsafe(2);
        buf.write(num+'', 0); //请求标识
        buf.write(level()+'', 1); //发送的消息
        socket.write(buf);
    }
    socket.on('data',data=>{
        console.log('client,',data.slice(1).toString(),data.slice(0,1).toString());
    })
    for(let i=0;i<10;i++){
        setTimeout(()=>{
            send(i);
        },i*2*100)
    }
    function level(){return Math.floor(Math.random()*(6-1+1))+1};
    //server.js
    const net = require('net');
    net.createServer((socket) => {
        socket.on('data',data=>{
          console.log('server,',data.slice(1).toString(),data.slice(0,1).toString());
          if(data){
            socket.write('response');
            setTimeout(()=>{
              const buf = Buffer.allocUnsafe(4);
              buf.write(data.slice(0,1).toString(),0);
              buf.write(obj[data.slice(1).toString()]||"",1);
              socket.write(buf);
            },10+Math.random()*1000)
          }
        })
      }).listen(2000,()=>{
        console.log('server is running')
      })
    
      const obj = {
        0:'000',
        1:'111',
        2:'222',
        3:'333',
        4:'444',
        5:'555',
        6:'666',
        7:'777',
        8:'888',
        9:'999'
      }
    

    相关文章

      网友评论

          本文标题:node RPC(Remote Procedure Call)

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