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报头较短,消耗带宽更少 | 消耗更多的带宽(报文较大) 消息边界 | 有 | 无 可靠性 | 低 | 高 顺序 | 无序 | 有序node

  • 事实上,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.jssocket

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

client.jsui

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