安卓局域網組播

知識背景:

組播使用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();

結束...

 

 

 

發佈了33 篇原創文章 · 獲贊 21 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章