前言
UDP
(用户数据报协议)是一种无连接协议,用于在网络上发送和接收数据报。UDP
通信的特点是简单、速度快、开销低,但不保证数据包的顺序和可靠性。UDP
常用于实时应用,如视频流、在线游戏和DNS
查询等。
说明
在UDP
(用户数据报协议)通信中,可以使用单播和组播两种模式
-
【单播模式】
1、单播是点对点的通信方式,数据报从一个单一的源地址发送到一个单一的目标地址。
-
【组播模式】
1、组播地址:这是一个特殊的IP地址范围,用于组播通信。组播地址的范围是 (224.0.0.0 - 239.255.255.255
)。
2、加入组播组:客户端和服务端必须使用相同的组播地址加入组播组。这意味着它们都会监听同一个组播地址上的数据包。
3、发送数据:发送方将数据包发送到组播地址,所有加入该组播组的接收方都可以接收到这个数据包。。
UDP
通信的基本步骤:
1、发送方(Sender):
- 创建一个
UDP
套接字 - 构造要发送的数据包(
DatagramPacket
) - 通过套接字发送数据包
2、接收方(Receiver):
- 创建一个
UDP
套接字并绑定到一个特定端口 - 准备一个缓冲区来接收数据包
- 通过套接字接收数据包
简单实现
1、单播模式发送端
class UnicastSender {private var socket: DatagramSocket? = nullfun sendData() {try {socket = DatagramSocket()val message = "I'm UniCast"val buffer = message.toByteArray()val receiverAddress = InetAddress.getByName("192.168.3.181")val packet = DatagramPacket(buffer, buffer.size, receiverAddress, 4445)socket?.send(packet)} catch (e: Exception) {e.printStackTrace()}finally {socket?.close()}}
}
2、单播模式接收端
class UnicastReceiver {private lateinit var socket: DatagramSocketfun receiverData() {try {socket = DatagramSocket(4445)val buffers = ByteArray(1024)val packet = DatagramPacket(buffers, buffers.size)socket.receive(packet)val receiver = String(packet.data, 0, packet.length)println("Received message: $receiver")} catch (e: Exception) {e.printStackTrace()}finally {socket.close()}}
}
3、组播模式发送端
class MulticastSender {private lateinit var socket: DatagramSocketfun sendData() {try {socket = DatagramSocket()val message = "I'm Multicast"val buffers = message.toByteArray()val group = InetAddress.getByName("230,0,0,0")val packet = DatagramPacket(buffers, buffers.size, group, 4446)socket.send(packet)println("Message sent to the multicast group.")} catch (e: Exception) {e.printStackTrace()}finally {socket.close()}}
}
4、组播模式接收端
class MulticastReceiver {private lateinit var socket: MulticastSocketfun receiverData() {try {socket = MulticastSocket(4446)val group = InetAddress.getByName("230.0.0.0")socket.joinGroup(group)val buffers = ByteArray(1024)val packet = DatagramPacket(buffers, buffers.size)socket.receive(packet)val data = String(packet.data, 0, packet.length)println("Received message: $data")} catch (e: Exception) {e.printStackTrace()} finally {try {val group = InetAddress.getByName("230.0.0.0")socket.leaveGroup(group)socket.close()} catch (e: Exception) {e.printStackTrace()}}}
}
总结
单播:用于点对点通信,数据报从一个源发送到一个目标。
组播:用于点对多点通信,数据报从一个源发送到一个组,这个组包含多个接收者。