nodejs-第一章-第二节-网络通信-构建UDP服务

内容索引:
  • UDP介绍
  • Node中的核心模块dgram
  • 使用node实现UDP单播
  • 使用node实现UDP广播
  • 使用node实现UDP组播
1.UDP简介
  • User Datagram Protocol,又称用户数据报协议
  • 和TCP一样,位于网络传输层用于处理数据包
  • UDP 最大特点无连接
  • UDP 传输速度快
  • UDP 数据传输不可靠
    • 不提供数据包分组,组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全到达的
    • 可靠性应由应用层负责
  • 支持一对一通信,也支持一对多通信
  • 许多关键的互联网应用程序使用UDP
    • 如DNS域名服务系统、TFTP简单文件传输协议,DHCP动态主机设置协议等
  • UDP适用于对书读要求比较高,对数据质量要求不严谨的应用
    • 如流媒体,实时多人游戏,实时音视频
1.1 TCP和UDP
  • | UDP | TCP ---|---|--- 连接| 无连接 | 面向连接 速度| 无需建立连接,速度较快 | 需要建立连接,速度较慢 目的主机 | 一对一,一对多 | 仅能一对一 带宽 | UDP报头较短,消耗带宽更少 | 消耗更多的带宽(报文较大) 消息边界 | 有 | 无 可靠性 | 低 | 高 顺序 | 无序 | 有序

  • 事实上,UDP 协议的这种乱序性基本上很少出现,通常只会在网络非常拥堵的情况下出现;

什么时候用TCP?什么时候用UDP ?

  • 对速度要求比较高的时候用UDP, 例如视频聊天,qq聊天
  • 对数据安全性要求比较高的时候用TCP,例如数据传输,文件下载
  • 假如对于视频聊天来说,如果画质优先就选用TCP,如果流畅度优先就选用UDP
1.2 UDP的三种传播方式
  1. UDP单播
    • 单播的地址为单一目标的一种传播方式
    • 地址范围:0.0.0.0 ~ 223.255.255.255
  2. UDP广播
    • 目的地址为网络中的所有设备
    • 地址范围分两种
      • 受限广播:它不会被路由转发,IP地址网络字段和主机字段全为1就是地址255.255.255.255
      • 直接广播:它会被路由转发,IP地址的网络字段定义这个网络,主机字段通常为1,如:192.168.10.255
  3. UDP组播
    • 多播也叫组播,把一组信息传递给一组目的地地址
  • 单播一对多
    • 单播通信中每一个数据包都有确切的IP地址
    • 对于同一份数据,如果存在多个接收者,Server需发送与接受者数目相同的单播数据包
    • 当接收者成百上千,将极大的家中Server的负担
  • 广播面对一对多
    • 广播数据包被限制在局域网中
    • 一旦有设备发送把广播数据则广播域内所有设备都收到这个数据包,并且不得不消耗资源去处理,大量的广播数据包将消耗网络的宽带及设备资源
    • 在IPv6中,广播的传输方式被取消
  • 组播面对一对多
    • 组播非常适合一对多的模型,只有加入到特定的组播成员,才会接收到组播数据。当存在多个组播成员时,源无需发送多个数据拷贝,仅需发送一份即可,组播网络设备会根据实际需要转发或拷贝组播数据
    • 数据流只发送给加入该组组播组的接受者(组成员),而不需要该数据的设备不会接收到该组播流量
    • 相同的组播报文,在一段链路上仅有一份数据,大大提高了网络资源的利用率

2. Node中的dgram模块

  • node的dgram模块用于构建UDP服务
  • 使用该模块创建UDP套接字非常简单,UDP套接字一旦创建,既可以作为客户端发送数据,也可以作为服务器接收数据;
const dgram = require('dgram')
const socket = dgram.createSocket('udp4')
2.1 socket方法
API说明
bind()绑定端口和主机
address()返回Socket地址对象
close()关闭Socket并停止监听
send()发送消息
addMembership()添加组播成员
dropMembership()删除组播成员
setBroadcast()设置是否启用广播
setTTL()设置数据报生存时间
setMulticastTTL()设置组播数据报生存时间
2.2 Socket事件
API说明
listening监听成功时触发,仅触发一次
message收到消息时触发
error发生错误时触发
close关闭socket时触发
#####. 使用Node实现UDP单播
const dgram = require('dgram')
const socket = dgram.createSocket('udp4')

socket.on('listening', () =>{
    console.log('连接成功')
})

如果客户端没有绑定端口号,操作系统会自动分配一个端口号;如果指定了端口号,必须在socket的listening事件成功后才能send消息;

  • sever.js
const dgram = require('dgram');
const server = dgram.createSocket('udp4');
server.on('listening', r => {
  console.log('连接成功server:');
});
server.on('message', (msg, remoteAddress) => {
  console.log(`成功连接到${remoteAddress.address}:${remoteAddress.port}`);
  server.send('服务器说:小子我收到你的消息了', remoteAddress.port);
});
server.on('close', () => {
  console.log('error');
});
server.bind(3000);
  • client.js
const dgram = require('dgram');
const client = dgram.createSocket('udp4');
client.on('listening', () => {
  const address = client.address();
  console.log(`成功连接到${address.address}:${address.port}`);
// 直接地址:192.168.10.255  把后三位改成255就可以
// 受限地址: 255.255.255.255
  client.send('hello', 3000, 'localhost');
});
client.on('message', (msg, remoteAddress) => {
  console.log(`客户端说收到服务器的消息了${msg}`);
});
client.on('error', () => {
  console.log('server errord');
});
client.bind(3200);
4.使用Node实现UDP广播模式
    // 在监听成功后,开启广播模式
server.on('listening', () =>{
    server.setBroadcast(true) 
})
5. 使用Node实现UDP组播

server.js

// 只用在发送消息时,指定组播ip就可以了
server.on('listening', () => {
    server.send('发送组播消息', 3300, '224.0.1.100', (err) =>{
        console.log(err)
    })
})

client.js

client.on('listening', () =>{
    // 监听成功后加入特定组播组的ip,此时客户端就会收到组播数据
    client.addMemberShip('224.0.1.100')
} )

转载于:https://my.oschina.net/u/3150996/blog/3083205

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值