对于前端开发,http服务是我们最长接触的通信服务,偶尔也会用到一些类似于聊天框的长链接应用,这些应用都不是基于HTTP开发的,HTTP是是无状态的短连接,说到长连接是不是首先会想到TCP,TCP是有状态的长连接协议。TCP和HTTP都是有连接的意思就是通信前需要建立连接,但是在计算机网络世界还有种无连接的协议UDP,下面我们就来了解下TCP在nodejs中的应用。
dgram
UDP(用户数据报协议)协议
对于UDP,我们可以结合TCP一起来看,他们之间的区别以及共同之处。
网络异常,图片无法展示
|
- 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一起了解,这两个协议许多都是相反的。一起学习的话应该更容易掌握。