UDP通信,适用于实时性要求高的场景,一般作为流媒体应用、语音交流、视频会议所使用的传输层协议,还有许多基于互联网的电话服务使用的VOIP(基于IP的语音)也是基于UDP运行的,实时视频和音频流协议旨在处理偶尔丢失的数据包,因此,如果重新传输丢失的数据包,则只会发生质量略有下降,而不是出现较大的延迟。
UDP优点:简单,轻量。
UDP缺点:没有流控制,没有应答确认机制,不能解决丢包、重发、错序问题。
并不是所有使用UDP协议的应用层都是不可靠的,应用程序可以通过增加确认和重传机制,自己实现可靠的数据传输,
下面我们使用nodejs16来实现一个简单的UDP通信。
服务端
//server.mjs
import dgram from 'dgram'
const server = dgram.createSocket('udp4',(msg,rinfo)=>{
console.log(msg.toString(),rinfo.address,rinfo.port,rinfo.size)
server.send('Hello I\'m server:',rinfo.port, rinfo.address)
})
server.on('error', (err)=>{
console.log(err)
})
server.on('listening', ()=>{
const address = server.address()
console.log(`server listening ${address.address} on ${address.port}`)
})
server.bind(41234)
客户端
//client.mjs
import dgram from 'dgram'
const client = dgram.createSocket('udp4', (msg, rinfo)=>{
console.log(msg.toString(),rinfo.address,rinfo.port,rinfo.size)
})
client.connect(41234,'127.0.0.1',()=>{
client.send('World2! from client',(err)=>{
if(err) console.log(err)
// client.close()
})
})
client.on('error', (err) => {
console.log(JSON.stringify(err))
})
client.on('connect', ()=>{
const rinfo = client.remoteAddress()
console.log('connect to: ',rinfo.address,rinfo.port,rinfo.family)
client.send('World! from client',rinfo.port,rinfo.address)
})
setTimeout(()=>{
client.close()
},2000)