about broadcast (java、android)
廣播(broadcast)
Code寫法與單播一樣,區別在於目的地址不同。單播使用的是特定ip地址,而廣播顧名思義就是要向其他的客戶端發送消息,所以使用的是255.255.255.255(ipv4)。
JAVA:
public static final String broadip = "255.255.255.255"; public static final int broadport = 8027; DatagramSocket socket= new DatagramSocket( broadport ); address = InetAddress.getByName(broadip); socket.setBroadcast(true); socket Saddress = new InetSocketAddress(broadip, broadport); socket .bind(Saddress);//接收時需要bind byte[] SendBuf = InMsg.getBytes();//String InMsg為要傳送的字串 int length = InMsg.getBytes().length; packet = new DatagramPacket(SendBuf, length,address,broadport); socket .send(packet);
群播(multicast)
稍微則稍微複雜一點。 Java提供了一個MulticastSocket的類來進行multicast,該類繼承於DatagramSocket。
多播地址一般為224.0.0.0 - 239.255.255.255(ipv4)。
JAVA:
InetAddress address = InetAddress.getByName("224.0.0.0"); if (!address.isMulticastAddress()) { throw new Exception("this is not multi address"); } packet = new DatagramPacket(byteToSend, byteToSend.length,address, 9999);
與廣播不同,它使用的是一個 群播 組。接收方需要加入這個組以告知對該組上的數據有興趣。所以接收方有一個joinGroup的操作,
JAVA:
MulticastSocket socket = new MulticastSocket(); socket.joinGroup(address);
demo download : https://docs.google.com/open?id=0B2Mp2cW7CWo5am9HSlozanZVc1k
----------------------------------------------------------------------------------------------
Multicast Server (UDP multicast receive)
public void CreateMulticastServer() { byte[] requestData = new byte[1024]; WifiManaget wifi = (WifiManager) getSystemService(getApplicationContext().WIFI_SERVICE); MulticastLock mLock = wifi.createMulticastLock("mylock"); mLock.acquire(); try{ InetAddress group = InetAddress.getByName("230.0.0.1"); MulticastSocket multiSocket = new MulticastSoket(PORT); multiSocket.joinGroup(group); } catch (IOException e) { e.printStackTrace(); } try{ while(true) { DatagramPacket requestPacket = new DatagramPacket(requestData, requestData.length); multiSocket.receive(requestPacket); String requestString = new String(requestPacket.getData(), 0, requestPacket.getLength()); Log.d("CreateMulticastServer","Got request = "+ requestString); } } catch (IOException e) { e.printStackTrace(); } try{ multiSocket.leaveGroup(group); multiSocket.close(); } catch (IOException e) { e.printStackTrace(); } mLock.release(); }
Multicast Client (UDP multicast send)
public void CreateMulticastClient() { String requestString = "ClientSendTest\n" byte[] requestData = new byte[requestString.length()]; requestData = requestString.getBytes(); WifiManaget wifi = (WifiManager) getSystemService(getApplicationContext().WIFI_SERVICE); MulticastLock mLock = wifi.createMulticastLock("mylock"); mLock.acquire(); try{ InetAddress group = InetAddress.getByName("230.0.0.1"); MulticastSocket multiSocket = new MulticastSoket(PORT); multiSocket.joinGroup(group); } catch (IOException e) { e.printStackTrace(); } try{ DatagramPacket requestPacket = new DatagramPacket(requestData, requestData.length, group, PORT); multiSocket.send(requestPacket); } catch (IOException e) { e.printStackTrace(); } try{ multiSocket.leaveGroup(group); multiSocket.close(); } catch (IOException e) { e.printStackTrace(); } mLock.release(); }
AndroidManifest.xml
.. <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> ..