Android開發:多點傳播(多點傳播)與廣播
近期由于需要編寫能夠使同一區域網路中的Android用戶端與PC端進行自動比對通信功能的程式,學習并試驗了JAVA多點傳播與廣播的内容,記錄一些了解如下:
一.多點傳播(多點傳播)
背景知識:多點傳播使用UDP對一定範圍内的位址發送相同的一組Packet,即一次可以向多個接受者發出資訊,其與單點傳播的主要差別是位址的形式。IP協定配置設定了一定範圍的位址空間給多點傳播(多點傳播隻能使用這個範圍内的IP),IPv4中多點傳播位址範圍為224.0.0.0到239.255.255.255。
JAVA程式設計:java中通過MulticastSocket執行個體進行通信,使用時涉及到幾個概念①TTL(Time To Live),每個IP封包都包含一個TTL(是一個數字),封包每被一個路由轉發一次它的TTL減1,當TTL變為0時,該封包被丢棄②多點傳播組(multicast group),接受者隻有加入這個組才能擷取發送到該組的封包(這就确定了多點傳播的對象)
JAVA代碼:
發送端(Android手機):
//-----------------------------------------------------------------------------------------
MulticastSocket mSocket = new MulticastSocket(30001);//生成套接字并綁定30001端口
InetAddress group=InetAddress.getByName("239.0.0.1");//設定多點傳播IP
byte[] buff = "QQ".getBytes("utf-8");//設定多點傳播封包的資料
mSocket.joinGroup(group);//加入多點傳播組,發送方和接受方處于同一組時,接收方可抓取多點傳播封包資訊
mSocket.setTimeToLive(4);//設定TTL
//設定UDP封包(内容,内容長度,多點傳播組,端口)
DatagramPacket packet = new DatagramPacket(buff,buff.length,group,30001);
mSocket.send(packet);//發送封包
mSocket.close();//關閉套接字
//-----------------------------------------------------------------------------------------
接收端(PC):
//-----------------------------------------------------------------------------------------
MulticastSocket s = new MulticastSocket(30001);//生成套接字并綁定端口
InetAddress group = InetAddress.getByName("239.0.0.1");//設定多點傳播IP
s.joinGroup(group);//接受者加入多點傳播組,需要和發送者在同一組
DatagramPacket packet = new DatagramPacket(buffer , 100);//建立接收封包,以接收通過多點傳播傳遞過來的封包
s.receive(packet);//接收多點傳播封包,程式停滞等待直到接收到封包
s.close();//關閉套接字
//-----------------------------------------------------------------------------------------
注意事項:
1.windows系統中的TCP/IP 的媒體感覺功能會導緻多點傳播報出這樣的錯誤:
java.net.SocketException: IP_ADD_MEMBERSHIP failed (out of hardware filters?)
windows7環境下解決方法如下:
使用系統資料庫編輯器 (運作中鍵入regedit) 來檢視下面的系統資料庫項: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters (Tcpip類似檔案夾一樣的圖示能展開裡面有Parameters,第一次找了很久)
添加以下系統資料庫值:
數值名稱:DisableDHCPMediaSense 資料類型:REG_DWORD 即(DWORD(32-位)值)建立後右擊修改其值為1,即關閉,重新開機機器即可
2.筆者用PC直接連接配接寬帶打開程式報錯,切斷寬帶運作正常,猜測為路由器拒絕轉發多點傳播,此問題有待研究(由于筆者使用Windows hostednetwork建立筆記本自己的網絡,将手機加入進來進行測試,是以對程式的測試仍可進行),此為實際程式中放棄使用多點傳播的一個原因
3.不是所有的路由器都支援多點傳播功能,并且一些支援多點傳播的路由器預設為關閉多點傳播的狀态,是以目前使用多點傳播寫程式時需要考慮實際可用性的問題
二.廣播
背景知識:
使用廣播,本地網絡中所有的主機都會受到一份資料副本。廣播使用UDP封包,IPv4使用(255.255.255.255)位址發送廣播,本地廣播絕不會被路由器轉發,即廣播資訊會被限制在本地網絡之内。
JAVA程式設計:
UDP單點傳播和廣播類似,主要是IP不同,都是用DatagramSocket對象進行發送
JAVA代碼:
發送端(Android手機)
//-----------------------------------------------------------------------------------------
byte[] buff = "QQ".getBytes("utf-8");//設定封包資訊
DatagramSocket socket=new DatagramSocket();//建立套接字,參數端口号不填寫,系統會自動配置設定一個可用端口
//建立封包,包括封包内容,内容長度,封包位址(這裡全1位址即為廣播),端口号(接受者需要使用該端口)
DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("255.255.255.255"), 30000);
socket.send(packet);//發送封包
socket.disconnect();//斷開套接字
socket.close();//關閉套接字
//-----------------------------------------------------------------------------------------
接受端(PC):
//-----------------------------------------------------------------------------------------
DatagramSocket socket=new DatagramSocket(30000);//建立套接字
byte[] buffer;//建立接收字元串
buffer=new byte[35];
DatagramPacket packet = new DatagramPacket(buffer , buffer.length);//建立接收封包,以接收通過廣播傳遞過來的
System.out.println("Listening at UDP(30000)....");
socket.receive(packet);//接收封包,程式停滞等待直到接收到封包
socket.disconnect();//斷開套接字
socket.close();//關閉套接字
//--
轉載自:http://blog.sina.com.cn/s/blog_751eaa830101cigu.html