Android IP多播MulticastSocket UDP实现

UDP多播 在智能设备领域 用处很多,WIFI密码配置等。

以下是自己动手实现的一个例子,算是总结下相关方面知识了,温故而知新。

package com.jy.viewpagefragment;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Timer;
import java.util.TimerTask;


import com.jy.example2.R;
import com.jy.example2.R.id;
import com.jy.example2.R.layout;
import com.jy.example2.R.menu;


import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.MulticastLock;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class UdpMultiMainActivity extends Activity {
//private InetAddress group;
private Handler handler; // 声明一个Handler对象

private static final String TAG="UdpMultiMainActivity";   
private static final int MULTICAST_PORT=5111;   
//private static final String GROUP_IP="224.5.0.7";
//239.255.255.250
private static final String GROUP_IP="239.255.255.250";

private static byte[] sendData;   
 
     MulticastSocket multicastSocket = null;
     InetAddress group = null;
     MulticastLock mlock;
   static{   
       sendData=new byte[4];   
       // 0xEE78F1FB   
       sendData[3] = (byte) 0xEE;   
       sendData[2] = (byte) 0x78;   
       sendData[1] = (byte) 0xF1;   
       sendData[0] = (byte) 0xFB;   
   } 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_udp_multi_main);


// 实例化一个Handler对象
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 更新UI
TextView tv = (TextView) findViewById(R.id.udptext); // 获取TextView组件
if (msg.what == 0x101) {
tv.setText(msg.getData().getString("title")); // 设置标题
//iv.setImageResource(path[msg.arg1]); // 设置要显示的图片
}
super.handleMessage(msg);
}


};
//private InetAddress group;


//WifiManager wm=(WifiManager)getSystemService(WIFI_SERVICE);
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
mlock=wm.createMulticastLock("mygroup");
mlock.acquire();



//创建多播组
try {
multicastSocket = new MulticastSocket(MULTICAST_PORT);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}   
        try {
        //multicastSocket.setLoopbackMode(true);

//设置本MulticastSocket发送的数据报被回送到自身  
multicastSocket.setLoopbackMode(false);  
Log.d("multicastSocket","setLoopbackMode false ");
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}   
        
try {
group = InetAddress.getByName(GROUP_IP);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}   
        try {
multicastSocket.joinGroup(group);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();

        
        Timer timer=new Timer();
      //  timer.schedule(new MyTimerTask(),3000);
        timer.schedule(new MyTimerTask(), 3 * 1000, 1 * 1000); //利用timer.schedule方法
        
        Thread t = new Thread(new MyThread()); // 创建新线程
t.start(); // 开启线程

       // new Thread().start();
        
       // new MyThread.start();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.udp_multi_main, menu);
return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

//时间任务
class MyTimerTask extends TimerTask{
//byte[] bs = new byte[1024];

  
@Override
public void run() {
// TODO Auto-generated method stub
//DatagramPacket packet = new DatagramPacket(sendData,sendData.length, group, Integer.valueOf(pro.getProperty("multicast_port")));
String ip=null;  
    //   byte[] multicast_string="multicastSocket";
       DatagramPacket packet=new DatagramPacket(sendData, sendData.length,group,MULTICAST_PORT);
      // for(;;){   
        try {
       
        multicastSocket.send(packet);   
            Log.d(TAG,">>>send packet ok");   
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d(TAG,">>>send packet IOException");  
}
    //   }
}



}
//Thread t = new Thread(new Runnable() 
class MyThread implements Runnable{
DatagramPacket packet=null;
byte[] receiveData=new byte[256];  
String ip=null;  
// DatagramPacket packet=new DatagramPacket(sendData, sendData.length,group,MULTICAST_PORT);   
public void run() {     
 
Log.d("run==","MyThread start");
packet=new DatagramPacket(receiveData, receiveData.length);   
try {
multicastSocket.receive(packet);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}   
     
Message m = handler.obtainMessage(); // 获取一个Message
m.arg1 = 1; // 保存要显示广告图片的索引值

m.what = 0x101; // 设置消息标识

Bundle bundle = new Bundle(); // 获取Bundle对象
bundle.putString("title", "get data"); // 保存标题
m.setData(bundle); // 将Bundle对象保存到Message中
handler.sendMessage(m); // 发送消息



String packetIpAddress=packet.getAddress().toString();   
packetIpAddress=packetIpAddress.substring(1, packetIpAddress.length());   
Log.d(TAG,"packet ip address: "+packetIpAddress);   
//03-10 14:40:53.433: D/UdpMultiMainActivity(31357): packet ip address: 192.168.123.28

/*
StringBuilder packetContent=new StringBuilder();   
for(int i=0;i<receiveData.length;i++){   
if(receiveData[i]==0){   
break;   
}   
packetContent.append((char)receiveData[i]);   
}   
ip=packetContent.toString();   
Log.d(TAG,"packet content ip is: "+ip);   
*/
//if(ip.equals(packetIpAddress)){   
int flag=1;
if(flag==1){  
Log.d(TAG,"find server ip address: "+ip);   
//break;   
}else{   
Log.d(TAG,"not find server ip address, continue …");   
try {   
Thread.sleep(1000);   
} catch (InterruptedException e) {  
e.printStackTrace();
}   
}   
}

}
private void closeWifiBrocast(){
if (mlock != null){
mlock.release();
mlock = null;
Log.e("closeWifiBrocast","closeWifiBrocast");
}
}
protected void onDestroy() {
closeWifiBrocast();


//timer.cancel(); //退出计时器

// flag= false;
super.onDestroy();
}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空胆好小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值