搜索吧:关键词: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.htmlpublic 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 blocke1.printStackTrace();}try {mBroadcastAddr=InetAddress.getByName(BROADCAST_IP);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.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;@Overridepublic void run() {// TODO Auto-generated method stubwhile(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 blocke.printStackTrace();}try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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() {@Overridepublic 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;}@Overridepublic void run() {// TODO Auto-generated method stubLog.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 blocke.printStackTrace();this.mScan = false;} try {Log.d(TAG, "sleep");Thread.sleep(100);// sleep(5000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private final int TOAST_MSG_RECEIVE = 0x01;private Handler mHandler = new Handler() {@Overridepublic 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


更多相关文章

  1. Android(安卓)模仿Path 的左右拉动菜单效果
  2. Drawable的Tint变色(让Android也能有iOS那么方便的图片色调转换)
  3. android 遮罩层效果
  4. android 一张图片实现 ImageView 实现 点击效果 图片明度变化
  5. Android墨迹3.0特性介绍效果实现——做一个垂直滚动的Layout
  6. 14—深入Animation,在SurfaceView中照样使用Android—Tween Anim
  7. Android火焰效果程序
  8. Android(安卓)chart、图表、条形图、饼图 pie chart 等的实现及
  9. Android(安卓)各种菜单,弹出菜单,打开文件子菜单,文本框的复制粘贴

随机推荐

  1. Android(安卓)隐去标题栏设置全屏
  2. android横竖屏切换参数
  3. Android编译过程详解(二)
  4. Android菜单详解——理解android中的Menu
  5. TableLayout常用细节
  6. Android(安卓)横竖屏总结
  7. [Android(安卓)UI] Activity Maintheme (
  8. android电池系统
  9. Android横竖屏总结
  10. AndroidManifest.xml文件详解(data)