前端需要去了解的nodejs知识(dgram)

1,320 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

对于前端开发,http服务是我们最长接触的通信服务,偶尔也会用到一些类似于聊天框的长链接应用,这些应用都不是基于HTTP开发的,HTTP是是无状态的短连接,说到长连接是不是首先会想到TCP,TCP是有状态的长连接协议。TCP和HTTP都是有连接的意思就是通信前需要建立连接,但是在计算机网络世界还有种无连接的协议UDP,下面我们就来了解下TCP在nodejs中的应用。

dgram

UDP(用户数据报协议)协议

对于UDP,我们可以结合TCP一起来看,他们之间的区别以及共同之处。 image.png

  • UDP是无连接的用户数据报协议
  • UDP是不可靠的传输,数据在传输过程中可能会丢失
  • UDP的传输速度是更快的
  • UDP的连接是可以一对一,一对多,多对多,多对一的
  • UDP应用场合:流媒体或游戏之类对数据准确性要求不是很高的应用,例如我们常用的视频通话,目前发展比较好的智能家居也是基于UDP在传输协议

nodejs中的dgram

  • nodejs中dgram的UDP传输共有三种,分别为:单播,组播,广播
  • 单播:服务端向单个客户端发送数据
const dgram =require('dgram');

const server = dgram.createSocket('udp4');

server.on('listening',()=>{
    var address=server.address();
    console.log('listening on:'+address.address+':'+address.port)
})
// 单播发送数据
server.on('message',(message,remote)=>{
    console.log('收到了你的消息: ', message.toString());
    const address = remote.address;
    console.log('remote.address: ', remote.address);
    const port = remote.port;
    console.log('remote.port: ', remote.port);
    // server.send('我已经收到你们发送的消息了!',port,address)
})
server.on('error',()=>{
    console.log('服务其出错了');
})
//绑定8888端口
server.bind(4000)

  • 广播、组播:通过ip和子网掩码计算出广播地址
const dgram =require('dgram');

const server = dgram.createSocket('udp4');
const multicastAddr = "*******"

server.on('listening',()=>{
    var address=server.address();
    //设置广播发送
    server.setBroadcast(true);
    server.setMulticastTTL(128);
    setInterval(()=>{
        console.log('发送消息')
        server.send('我已经上线了!',5000,'广播地址**')
        server.send('大家好啊,我是服务端组播消息', 8061, multicastAddr);
    },3000)
    console.log('listening on:'+address.address+':'+address.port)
})

server.on('error',()=>{
    console.log('服务其出错了');
})
//绑定8888端口
server.bind(4000)
  • 启动客户端服务
const dgram =require('dgram');
const client = dgram.createSocket('udp4');
// 需要和服务端设置的相同
const multicastAddr = "*******"


client.on("listening", () => {
    console.log("listening");
    //设置客户的组播地址
    client.addMembership(multicalAddress)\
})

client.on('message',(msg)=>{
    console.log('我收到了服务端发送的消息!')
    console.log('msg: ', msg.toString());
    client.send(`hello,I am client`,4000,'localhost');
})

client.on("close", () => {
    console.log("socket已经关闭");
})
client.bind(5000,"127.0.0.1")

总结

UDP协议最经典的应用应该就是微信端视频聊天了,视频聊天追求的是时效性,而TCP为了保证数据的准确性会在进行回复,重传,网络探测等等一系列的控制,这些都影响了传输的时效性,因此对于追求快速传输且对数据准确性要求不太高的应用UDP就是更好的选择。UDP在我们前端开发中其实接触的比较少,但我们可以和TCP一起了解,这两个协议许多都是相反的。一起学习的话应该更容易掌握。