关于Android系统的局域网广播的相关东东
16lz
2021-01-26
搜索吧:关键词: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
更多相关文章
- Android(安卓)模仿Path 的左右拉动菜单效果
- Drawable的Tint变色(让Android也能有iOS那么方便的图片色调转换)
- android 遮罩层效果
- android 一张图片实现 ImageView 实现 点击效果 图片明度变化
- Android墨迹3.0特性介绍效果实现——做一个垂直滚动的Layout
- 14—深入Animation,在SurfaceView中照样使用Android—Tween Anim
- Android火焰效果程序
- Android(安卓)chart、图表、条形图、饼图 pie chart 等的实现及
- Android(安卓)各种菜单,弹出菜单,打开文件子菜单,文本框的复制粘贴