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" />
..
posted @ 2012-11-12 18:27  日光之下无新事  阅读(1544)  评论(0编辑  收藏  举报