目的
UDP是比较基础常用的网络通讯方式,这篇文章将介绍Node.js中UDP基础使用的一些内容。
本文中使用Node.js版本为v16.17.1,UDP相关官方文档如下:
https://nodejs.org/dist/latest-v16.x/docs/api/dgram.html
本文中使用 Packet Sender 工具进行测试,其官网地址如下:
https://packetsender.com/
作为客户端使用
作为客户端使用主要就是向某个服务器发送消息了,主要就是使用send方法了:
socket.send(msg[, offset, length][, port][, address][, callback])
msg
<Buffer> | <TypedArray> | <DataView> | <string> | <Array> Message to be sent.offset
<integer> Offset in the buffer where the message starts.length
<integer> Number of bytes in the message.port
<integer> Destination port.address
<string> Destination host name or IP address.callback
<Function> Called when the message has been sent.
下面是个基本的测试代码:
const dgram = require('node:dgram');
const client = dgram.createSocket('udp4');
// 发送消息,对方端口号是50280,127.0.0.1是内部回环地址,表示这是发给本机自己的
client.send('naisu233', 50280, '127.0.0.1');
作为服务器使用
UDP一个比较基础的使用就是作为服务器使用。作为服务器使用时可以监听本机上网卡收到的发送给指定端口号的消息。
作为服务器使用主要就是监听某个端口号,然后处理收到消息时的事件即可。下面是个基本的测试代码:
const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');
// 发生异常时触发
server.on('error', (err) => {
console.log(`server error:\n${err.stack}`);
server.close();
});
// 收到消息时触发
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); // 打印收到的消息、对方地址及端口号
server.send(`you msg is ${msg}`,rinfo.port,rinfo.address) // 向对方发送消息(可选)
});
// 启动监听时触发
server.on('listening', () => {
const address = server.address();
console.log(`server listening ${address.address}:${address.port}`); // 打印自身地址和监听端口号
});
server.bind(22333); // 监听本地所有网卡的22333端口号
可以使用 close
方法关闭Socket并停止监听。
广播
广播主要就是指发送时向内网中所有设备发送消息了,操作上最主要就是发送消息时地址使用 广播地址 ,广播地址计算方式可以参考下面文章:
《UDP IPv4广播地址计算(附Node.js示例代码)》
https://blog.csdn.net/Naisu_kun/article/details/127221349
需要注意的是如果设备上有多个网卡的话就可能有多个广播地址,要全局广播的话就要向每个广播地址分别发送消息。
在Node.js中想使用 本地广播(local broadcast)广播地址为255.255.255.255的广播,需要启用相关功能:
udp.bind(() => {
udp.setBroadcast(true);
});
总结
UDP的使用比较简单,更多内容可以参考官方文档。