基于NodeJs的UDP通信

使用NodeJs实现UDP通信

nodejs的dragm模块文档
关于udp4/udp6套字类型文档里写的很清楚,具体请移步上方官方文档


原理
使用UDP,如果你要发送数据,只需要知道对方的主机名(地址)和端口号,
扔一消息过去即可。至于对方收不收得到,听天由命了。这就是数据报服务

注意:

socket.send(msg[, offset, length][, port][, address][, callback])

 第一个参数:要发送的数据
 第二个参数:发送数据的偏移量
 第三个参数:发送数据的字节数
 第四个参数:目标端口
 第五个参数:目标主机名和IP地址
 第六个参数:消息发送完毕的回调函数

msg 参数包含了要发送的消息。 根据消息的类型可以有不同的做法。 如果 msg 是一个 Buffer、 TypedArray 或 DataView,则 offset 和 length 指定了消息在 Buffer 中对应的偏移量和字节数。 如果 msg 是一个 String,那么它会被自动地按照 ‘utf8’ 编码转换为 Buffer。 对于包含了多字节字符的消息, offset 和 length 会根据对应的字节长度进行计算,而不是根据字符的位置。 如果 msg 是一个数组,那么 offset 和 length 必须都不能被指定。

address 参数是一个字符串。 若 address 的值是一个主机名,则 DNS 会被用来解析主机的地址。 若 address 未提供或是非真值,则 ‘127.0.0.1’(用于 udp4 socket)或 ‘::1’(用于 udp6 socket)会被使用。

若在之前 socket 未通过调用 bind 方法进行绑定,socket 将会被一个随机的端口号赋值并绑定到“所有接口”的地址上(对于 udp4 socket 是 ‘0.0.0.0’,对于 udp6 socket 是 ‘::0’)。

可以指定一个可选的 callback 方法来汇报 DNS 错误或判断可以安全地重用 buf 对象的时机。 在 Node.js 事件循环中,DNS 查询会对发送造成至少一个时间点的延迟。

确定数据包被发送的唯一方式就是指定 callback。 若在 callback 被指定的情况下有错误发生,该错误会作为 callback 的第一个参数。 若 callback 未被指定,该错误会以 ‘error’ 事件的方式投射到 socket 对象上。

偏移量和长度是可选的,但如其中一个被指定则另一个也必须被指定。 另外,它们只在第一个参数是 Buffer、 TypedArray 或 DataView 的情况下才能被使用。

server.js
const dgram = require('dgram');
//创建upd套接字
//选择‘udp4’套字类型
const server = dgram.createSocket('udp4');

//绑定端口和主机地址,dgram.Socket的bind方法把socket和一个端口绑定到一起
server.bind(8080, '127.0.0.1');

// 监听端口
server.on('listening', () => {
    console.log('服务器运行在:http://127.0.0.1:8080');
})

//接收消息
//rinfo远程主机的地址信息
server.on('message', (message, rinfo) => {

    console.log(`服务器收到来自${rinfo.address}:${rinfo.port}的消息: ${message}  `)

})

//使用 close() 关闭socket之后触发
server.on('close', () => {
    console.log('服务器已关闭!');
});

//错误处理
server.on('error', (err) => {
    console.log(err)

})


client.js
const dgram = require('dgram');
const client = dgram.createSocket('udp4');
const PORT = 8080;
const HOST = '127.0.0.1'

//buffer用来存储数据
const message = Buffer.from('我是client,我来自客户端!')

client.send(message, 0, message.length, PORT, HOST, (err, bytes) => {
    if (err) {
        console.log(err);
    }
    console.log(`服务器发送消息到:http://${HOST}:${PORT}`);
    console.log(`发送了 ${bytes} 个字节数据`);
     client.close();

})

client.on('close', () => {
    console.log('客户端已关闭!')
})

//错误处理
client.on('error', (error) => {
    console.log(error)
})



运行结果

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值