【Android通信】UDP的单播和组播模式

前言

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? = null
    
    fun 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: DatagramSocket

    fun 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: DatagramSocket

    fun 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: MulticastSocket

    fun 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()
            }
        }
    }
}


总结

单播:用于点对点通信,数据报从一个源发送到一个目标。
组播:用于点对多点通信,数据报从一个源发送到一个组,这个组包含多个接收者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值