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)));
......
}
........