现在的位置: 首页 > 综合 > 正文

关于Android系统的局域网广播的相关东东

2013年05月08日 ⁄ 综合 ⁄ 共 5579字 ⁄ 字号 评论关闭

搜索吧:关键词:android, udp, 局域网, lan,广播,源代码

最近公司在做一个游戏项目,互联网对战方面的东东已经差不多搞定,还剩下局域网方面的东东没做,大概的功能需求是需要达到像飞鸽差不多的效果吧,但是在网络查了一天关于android的局域网广播的资料,不管是国内的还是国外的,发现没多少,大部分都是问,但是具体怎么解决的有答案的很少,自己摸索了一下,今天上午做了一个demo,能够看到局域网的通信效果了。有了个demo看到效果了就感觉有了很大的希望了。

关于广播组的ip问题,可以参看这篇帖子http://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/net/MulticastSocket.html,不是什么自己ip地址后面改为255,也不是改成网关之类的。

下面把demo的客户端和服务器端代码贴出来:

package com.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;


public class MulticastServer implements Runnable{
	
	private InetAddress mBroadcastAddr;
	private DatagramSocket mSocket;
	private DatagramPacket mDatagram;
	
//	private String mSendData = "AAAA";
	
	private byte[] mBuffer = null;
	// mSendData.getBytes();
	
	public static final int SERVER_SEND_PORT = 4445;
	public static final int CLIENT_RECEIVE_PORT = 4446;
	
	//Seehttp://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/net/MulticastSocket.html
	public static final String BROADCAST_IP = "234.5.6.7"; 
	
	private Thread mThread = null;
	
	private static final String TAG = "MulticastServer";
	
	private Context mContext = null;
	public MulticastServer(Context context){
		Log.d(TAG, "######## MulticastServer ##########");
		
		mContext = context;
		
		WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
		WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock("mydebuginfo");
		multicastLock.acquire();
		
		try {
			mSocket = new DatagramSocket(SERVER_SEND_PORT);
		} catch (SocketException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		try {
			mBroadcastAddr=InetAddress.getByName(BROADCAST_IP);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Log.d(TAG, "MulticastServer");
		
		mBuffer = getLocalIpAddress().getBytes();
		
		String str = new String(mBuffer);
		Log.d(TAG, "mBuffer = " + str);
		
		mDatagram = new DatagramPacket(mBuffer, mBuffer.length, mBroadcastAddr, CLIENT_RECEIVE_PORT);
		
		mThread = new Thread(this);
		
	}

	public void startSend() {
		Log.d(TAG, "startSend");
		
		SEND_FLAG = true;
		mThread.start();
	}
	
	
	public void stopSend() {
		SEND_FLAG = false;
	}
	
	
	private boolean SEND_FLAG = true;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(SEND_FLAG) {
			broadcast_data();
		}
	}
	
	private String sendStr = "";
	private void broadcast_data()
	{

		try {
			Log.d(TAG, "broadcast_data");
			
			mSocket.send(mDatagram);
			sendStr = new String(mDatagram.getData());
			Log.d(TAG, "send ok data = " + sendStr);
			mHandler.sendEmptyMessage(TOAST_MSG_SEND);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String getLocalIpAddress() {  
        try {  
            for (Enumeration<NetworkInterface> en = NetworkInterface  
                    .getNetworkInterfaces(); en.hasMoreElements();) {  
                NetworkInterface intf = en.nextElement();  
                for (Enumeration<InetAddress> enumIpAddr = intf  
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {  
                    InetAddress inetAddress = enumIpAddr.nextElement();  
                    if (!inetAddress.isLoopbackAddress()) {  
                        return inetAddress.getHostAddress().toString();  
                    }  
                }  
            }  
        } catch (SocketException ex) {  
            Log.e("WifiPreference IpAddress", ex.toString());  
        }  
        return "";  
    }
	
	private final int TOAST_MSG_SEND = 0x01;
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			case TOAST_MSG_SEND:
				Toast.makeText(mContext, sendStr, Toast.LENGTH_SHORT).show();
			}
		}
	};
}

下面是Client端代码:

package com.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

public class MulticastClient implements Runnable {

	private MulticastSocket mMultiSocket;
	private InetAddress mAddress;

	private boolean mScan = false;

	private Thread mThread = null;

	private byte[] mBuffer = new byte[256];

	private DatagramPacket mDatagram = null;

	private static final String TAG = "MulticastClient";
	private Context mContext = null;

	public MulticastClient(Context context) throws IOException {
		mContext = context;

		Log.d(TAG, "######## MulticastClient #########");
		mAddress = InetAddress.getByName(MulticastServer.BROADCAST_IP);

		mMultiSocket = new MulticastSocket(MulticastServer.CLIENT_RECEIVE_PORT);

		mMultiSocket.joinGroup(mAddress);

		Log.d(TAG, "MulticastClient");

		mThread = new Thread(this);

		// scan_recv();
	}

	public void startReceive() {
		this.mScan = true;
		mThread.start();
	}

	public void stopReceive() {
		this.mScan = false;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		Log.d(TAG, "run");
		scan_recv();
	}

	private String receiveStr = "";

	public void scan_recv() {

		// DatagramPacket packet;

		while (mScan) {
			Log.d(TAG, "scan_recv");

			try {
				mDatagram = new DatagramPacket(mBuffer, mBuffer.length);
				mMultiSocket.receive(mDatagram);
				receiveStr = new String(mDatagram.getData());
				Log.v(TAG, "^^^^^^^^^data = " + receiveStr + "^^^^^^^^^^^^");
				mHandler.sendEmptyMessage(TOAST_MSG_RECEIVE);

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				this.mScan = false;
			} 

			try {

				Log.d(TAG, "sleep");

				Thread.sleep(100);
				// sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}

	private final int TOAST_MSG_RECEIVE = 0x01;
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case TOAST_MSG_RECEIVE:
				Toast.makeText(mContext, receiveStr, Toast.LENGTH_SHORT).show();
			}
		}
	};

}

不过有个问题,在模拟器上收不到消息,只能收自己的,跟真机通信不了,试了网上别人说的还是没效果,反正有几个平板可以用,就不折腾这个问题了,用知道怎么解决这个问题的童鞋麻烦教我一下啦,谢谢。

截了一张demo图,这是模拟器上自己发送,自己接收的效果。

整个demo的代码我放到我的下载里面,想要的可以自己去取。(别给我留邮箱,留也没时间发)

这个帖子讲的挺详细http://book.51cto.com/art/200809/89225.htm

抱歉!评论已关闭.