天天看點

Android開發:多點傳播(多點傳播)與播音



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