Android如何在局域网中发送网络广播

Android如何在局域网中发送网络广播

目前做的项目是当两个设备都接入一个Wifi热点后可以找到对方。如何找呢?大家一下子就会想到发送广播,对的就是发送广播。下面是一个实例如何发送一个UDP广播的例子。首先端口是事先约定好的,

Android端代码:

    static void sendBroadCastToCenter(){
        WifiManager wifiMgr = (WifiManager) App.getContext().getSystemService(Context.WIFI_SERVICE);

        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();

        /*这里获取了IP地址,获取到的IP地址还是int类型的。*/
        int ip = wifiInfo.getIpAddress();

		/*这里就是将int类型的IP地址通过工具转化成String类型的,便于阅读
        String ips = Formatter.formatIpAddress(ip);
		*/
		
		/*这一步就是将本机的IP地址转换成xxx.xxx.xxx.255*/
        int broadCastIP = ip | 0xFF000000;
      
        DatagramSocket theSocket = null;
        try {
                InetAddress server = InetAddress.getByName(Formatter.formatIpAddress(broadCastIP));
                theSocket = new DatagramSocket();
                String data = "Hello";
                DatagramPacket theOutput = new DatagramPacket(data.getBytes(), data.length(), server, mPort);
                /*这一句就是发送广播了,其实255就代表所有的该网段的IP地址,是由路由器完成的工作*/
                theSocket.send(theOutput);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (theSocket != null)
                theSocket.close();
        }
    }

通过上面的代码就算发送出去了,但怎么也的有个接收的吧。对啊,如果谁也不接收,发送广播就没有意义了。

接收端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPDiscardSServer {
	public static void main(String[] args){
		byte[] buffer = new byte[1024];
		/*在这里同样使用约定好的端口*/
		int port = 8091;
		DatagramSocket server = null;
		try {
			server = new DatagramSocket (port);
			DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
			while(true){
				try {
					server.receive(packet);
					String s = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
					System.out.println("address : " + packet.getAddress() + ", port : " + packet.getPort() + ", content : " + s);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}finally{
			if(server != null)
				server.close();
		}
	}
}

最后

有的路由器是禁止发送广播的,那只能采用扫描的方式了,其实效率也挺高的毕竟没有几个IP地址。附带一个扫码的代码,其实和刚才的代码非常相似。

.......
  int ip = wifiInfo.getIpAddress();
  int broadCastIP = ip | 0xFF000000;
  
  for (int i = 0; i < 256; i++) {
	  .....
	  /*通过这个循环就将所有的本段中的所有IP地址都发送一遍了*/
	  InetAddress server = InetAddress.getByName(Formatter.formatIpAddress(broadCastIP | ((0xFF - i) << 24)));
	  ......
  }
  ........

你可能感兴趣的:(Android)