1. Udp中的消息传播方式:组播、广播、单播。
1.1. 组播:
1.1.1、 组播说明:udp组播又称为多播,就是将消息封装到数据包中,发送到一个多播地址组中,处于当前地址组中的终端都能够收到消息。
1.1.2、 组播的java实现:
1.1.2.1. Java中UDP多播通过MulticastSocket(多播数据报套接字类)实现,多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在 224.0.0.0 和 239.255.255.255 的范围内(包括两者)。地址 224.0.0.0 被保留,不应使用。
1.1.2.2. 将消息发送到多播组时,该主机和端口的所有预定接收者都将接收到消息(在数据包的生存时间范围内,请参阅下文)。套接字不必成为多播组的成员即可向其发送消息。
1.1.2.3. 当套接字预定多播组/端口时,它将接收由该组/端口的其他主机发送的数据报,像该组和端口的所有其他成员一样。套接字通过 leaveGroup(InetAddress addr) 方法放弃组中的成员资格。多个MulticastSocket 可以同时预定多播组和端口,并且都会接收到组数据报。
1.2. 广播和单播:
1.2.1. 广播和单播一致,都是由网络上的一个终端向网络中的其他终端发送数据,唯一的不同是,广播是向网络中的所有的终端发送数据,而单播是向网络中的具体终端发送数据。
1.2.2. 广播和单播的java实现:
在java中,广播和单播是通过DatagramSocket和数据包DatagramPacket实现,广播发送的host是255.255.255.255,而单播的host是具体的某一个地址host。
2. 实现udp协议需要注意的地方:
2.1. DatagramSocket封装的是本地的端口号port,可以设置本地host,但没有必要,DatagramPacket(数据包)封装的是目的地终端的host和port,在java都有相应的api对齐描述,可以获取到数据包的host和port进行调试。
2.2. 在本地的一个端口上可以同时进行数据包的发送和接受,DatagramSocket(全局),设置同一个端口号,对于有些物联设备接受到的数据源端口号和响应数据源端口号一致才可以。
2.3. 详细的情形可以参照easylink协议(海尔冰箱卫士封装协议)。
2.4. 对于广播的时候,特别注意要设置DatagramSocket支持广播的发送。
3. Udp数据包的格式封装
3.1. 数据格式之间进制的说明。
3.1.1. 字节,位,字符的理解:
一个字节8位,相对于字符,中文字符(java)是两个字节,英文字符是一个字节。
Byte:一个字节8位,表示的数据范围是-2的7次方--2的7次方– 1(-128--127)
Short:两个字节,16位,表示的范围是-2的15次方—2的15次方-1(-32768-32767)
Int:4个字节,32位表示范围:-2的31次方和2的31次方-1
Long:8个字节 64位表示范围:-2的64次方和2的64次方-1
3.1.2. 代码开发中进制的理解:
在代码开发常用的包括:16进制,2进制和10进制。日常代码写的规范是10进制,进制之间通过算法可以互相转换。具体的转换utils文档见easylinkhelper。
Udp协议常用的16进制字节数组或者2进制字节数组,具体的16进制数组和2进制数组不会写,采用的是曲线救国,写整形数据再转换成为16进制字节数组,最后总拼接字节数组。
补充:字节数组的写法和其他数组类型一样,16进制数组的每一个对应添加0x标示即可。