项目需求:向局域网内的1025端口发送广播“Are You Device?”,设备收到广播后返回设备信息
udp发送广播并接收数据的流程基本都是通用的
1.发送数据:
(1)新建一个DatagramSocket对象 DatagramSocket udpSocket = new DatagramSocket();
(2)将需要广播的数据转成byte形式
(3)新建一个DatagramPacket对象指定需要广播的端口和地址DatagramPacket dataPacket = new DatagramPacket(buffer, buffer.length,InetAddress.getByName("255.255.255.255"),1025);
(4)调用DatagramSocket的send方法发送packet, udpSocket.send(dataPacket);
2.接收数据
(1)新建一个DatagramSocket对象 DatagramSocket udpSocket = new DatagramSocket();
(2)新建一个DatagramPacket对象,用于接收传过来的数据 DatagramPacket dpIn=new DatagramPacket(bufferIn,bufferIn.length);
(3)调用DatagramSocket的receive方法接收数据 udpSocket.receive(dpIn);
3.发送和接收异步执行
核心代码如下
Runnable searchRunnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
try
{
bFindGateway = true;
DatagramPacket dataPacket = null;
udpSocket.setBroadcast(true);
buffer = dataString.getBytes();
dataPacket = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("255.255.255.255"), 1025);
while(bFindGateway){
udpSocket.send(dataPacket);
}
} catch (Exception e)
{
e.printStackTrace();
Log.e("2", e.toString());
}
}};
Thread searchThread = new Thread(searchRunnable);
searchThread.start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try{
bFindGateway = true;
DatagramPacket dpIn = null;
while(bFindGateway){
byte[] bufferIn = new byte[1024];
dpIn = new DatagramPacket(bufferIn, bufferIn.length);
Log.e("receive", "receive");
udpSocket.receive(dpIn);
String result = new String(dpIn.getData(), dpIn.getOffset(), dpIn.getLength());
Log.e("result", result);
JSONObject obj = new JSONObject(result);
String macId = obj.getString("mac_id");
String type = obj.getString("machine_type");
if(!type.equals("-1")) {
resultSet.add(macId);
}
}
}
catch(Exception e){
e.printStackTrace();
Log.e("3", e.toString());
}
}
}).start();
详细代码及示例见http://download.csdn.net/detail/err118/9138151