知識背景:
組播使用UDP對一定範圍內的地址發送相同的一組Packet,即一次可以向多個接受者發出信息,其與單播的主要區別是地址的形式。IP協議分配了一定範圍的地址空間給多播(多播只能使用這個範圍內的IP),IPv4中組播地址範圍爲224.0.0.0到239.255.255.255。
MulticastSocket概念:
java中通過MulticastSocket實例進行通信,使用時涉及到幾個概念
①TTL(Time To Live),每個IP報文都包含一個TTL(是一個數字),報文每被一個路由轉發一次它的TTL減1,當TTL變爲0時,該報文被丟棄;
②多播組(multicast group),接受者只有加入這個組才能獲取發送到該組的報文(這就確定了組播的對象);
代碼實現:
1. 權限申請
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
2. 獲取組播鎖
調用MulticastLock對象的acquire方法,獲取到組播鎖,相應的,用完組播,爲了不浪費電力,要調用MulticastLock的release方法釋放鎖
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
multicastLock = wifiManager.createMulticastLock("multicast.test");
multicastLock.acquire();
3. 釋放組播鎖
multicastLock.release();
4. 組播的初始化
private static final int PORT = 16664;
private static final String IP = "224.0.0.251";
MulticastSocket multicastSocket = new MulticastSocket(PORT);
InetAddress group = InetAddress.getByName(IP);
multicastSocket.setLoopbackMode(false);
multicastSocket.joinGroup(group);
5. 發送組播數據
String message = "hello" + index;
DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(), message.length(), group, PORT);
try {
multicastSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
index++;
6. 接收組播數據
byte[] buffer = new byte[1024 * 10];
DatagramPacket recv = new DatagramPacket(buffer, buffer.length, group, PORT);
while (true) {
try {
multicastSocket.receive(recv);
byte[] data = recv.getData();
} catch (IOException e) {
e.printStackTrace();
}
}
7. 組播的關閉
try {
multicastSocket.leaveGroup(group);
} catch (IOException e) {
e.printStackTrace();
}
multicastSocket.close();
multicastSocket = null;
multicastLock.release();
結束...