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

来源:互联网 发布:轩辕剑神器进阶数据 编辑:程序博客网 时间:2024/05/17 19:59

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)));      ......  }  ........
0 0
原创粉丝点击