首先是发送

package remote.com;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.io.Serializable;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;import java.nio.Buffer;import java.util.ArrayList;import java.util.List;import udpreceive.com.UdpReceive;import android.app.Activity;import android.content.Intent;import android.hardware.Camera.Size;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class RemoteActivity extends Activity {    /** Called when the activity is first created. */private Button start_button;private Button end_button;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        start_button = (Button)findViewById(R.id.start_bu);        end_button = (Button)findViewById(R.id.end_bu);                Intent intent = new Intent();        intent.setClass(RemoteActivity.this, UdpReceive.class);        RemoteActivity.this.startService(intent);                        System.out.println("mian activity thread = " +  Thread.currentThread().getId());                        start_button.setOnClickListener(new View.OnClickListener() {       public void onClick(View v) {// TODO Auto-generated method stub        int server_port = 60000;          String server_addr = "192.168.1.233";                         String aa = "aa";                         try {            byte[] bytesa = aa.getBytes();    int bytesa_len = bytesa.length;DatagramSocket socket = new DatagramSocket(server_port); InetAddress local = InetAddress.getByName(server_addr);DatagramPacket sendSocket = new DatagramPacket(bytesa, bytesa_len, local, server_port);socket.send(sendSocket);System.out.println("send success");socket.close();  //很关键, 发完后必须cloas 不然再点就发不了了} catch (Exception e) {  // TODO: handle }                System.out.println("main activity thread id = " + Thread.currentThread().getId());        }});           end_button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {// TODO Auto-generated method stub        Intent intent = new Intent();        intent.setClass(RemoteActivity.this, UdpReceive.class);        RemoteActivity.this.stopService(intent);}});            //                    }    //////    }

然后是接收 ,接收 是新建了一个线程 , new thread.start

package cfg.mft;import gloabal.mft.MyApplication;import java.io.IOException;import java.net.BindException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;import android.app.Activity;import android.app.Service;import android.content.Context;import android.content.Intent;import android.net.wifi.WifiManager;import android.net.wifi.WifiManager.MulticastLock;import android.os.Bundle;import android.os.IBinder;import android.util.Log;public class CfgUdpReceive extends Service{private boolean threadDisable;private int count;MyApplication app;   WifiManager wifi;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stub  return null;} @Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();System.out.println( "到了UdpReceive了"); new Thread(new ServerThread()).start();}class ServerThread extends Thread{                public void run(){              Log.d("UDP Demo","到了里面了");              while (true) {                // UDP服务器监听的端口               try {                    DatagramSocket socket = new DatagramSocket(15001);                      byte data [] = new byte[1024];                      //创建一个空的DatagramPacket对象                      DatagramPacket packet = new DatagramPacket(data,data.length);                      //使用receive方法接收客户端所发送的数据                        if(socket == null){                    break;                    }                    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);                    MulticastLock ml = wifi.createMulticastLock("just some tag text");                    ml.acquire();                    //                socket.receive(packet);                  String result = new String(packet.getData(),packet.getOffset(),packet.getLength());                  Log.d("log", "收到udpReceive");                //System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId());                                  app = (MyApplication) getApplication();                app.setName(1);                ml.release();                                socket.close();                                        } catch (Exception e) {// TODO: handle exception}            }          }      }          @Override    public void onDestroy() {        super.onDestroy();        this.threadDisable = true;        Log.v("CountService", "on destroy");    }    public int getCount() {        return count;    }}

然后是 manifest 里面添加权限

<uses-permission android:name="android.permission.INTERNET"/>

--

关于HTC 手机不能接收 问题 在 while 前 执行 下面的

WifiManager wifi;wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);MulticastLock ml = wifi.createMulticastLock("just some tag text");ml.acquire();

如果 执行完了, 在 while 里面的 最后 执行

ml.release();
                //创建一个DatagramSocket对象,并指定监听的端口号                  DatagramSocket socket = new DatagramSocket(15001);                  byte data [] = new byte[1024];                  //创建一个空的DatagramPacket对象                  DatagramPacket packet = new DatagramPacket(data,data.length);                  //使用receive方法接收客户端所发送的数据                                    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);                MulticastLock ml = wifi.createMulticastLock("just some tag text");                ml.acquire();                while (true) {                socket.receive(packet);                  String result = new String(packet.getData(),packet.getOffset(),packet.getLength());                  //System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId());                                  app = (MyApplication) getApplication();                app.setName(1);                ml.release();                }

---

如果在虚拟机里面 搞不定, 不能接收 UDP 通知, 那需要 改 下 ip端口

解决方法:
1. 运行模拟器
2. 打开window 命令行
执行:telnet localhost 5554 或者是 telnet 127.0.0.1 5554
5554是模拟器的端口,执行之后会进入android console
3. 在console下执行:

redir add udp :端口号:端口号

例如:
redir add udp:22221:22221
其中,第一个端口号是模拟器1的端口,第二个端口号是模拟器2端口。(端口映射)
执行此命令之后,会把模拟器 22221 端口发送的数据通过本机转到模拟器的22221端口,就能从22221端口接收UDP数据包了

-----------------------------------------------------------------------------

此外以上的做法有个个确定就是 在 接收的时候 要指定 端口 ,下面这个 接收方式 在同一个socket 下面就不用 在接收的时候指定端口了

    class ServerThread extends Thread{        public void run(){        int server_port = 8257;          String server_addr = "192.168.1.233";                    String aa = "aaaa";                         try {            byte[] b = aa.getBytes();    int b_len = b.length;socket = new DatagramSocket(server_port); InetAddress local = InetAddress.getByName(server_addr);DatagramPacket sendSocket = new DatagramPacket(b, b_len, local, server_port);socket.send(sendSocket);System.out.println("send success" );                   } catch (Exception e) {  // TODO: handle e.printStackTrace();}           byte buff[]=new byte[1024];        DatagramPacket receivePacket=new DatagramPacket(buff,buff.length);         try {        socket.setSoTimeout(5000);  //设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效         socket.receive(receivePacket);                String result = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());                        String rr = bin2hex(result);        System.out.println("result--->" + rr + "\n" + " now thread id = " + Thread.currentThread().getId());} catch (Exception e) {// TODO: handle exceptionsocket.close(); }                //////////    }    }

如果是接收多个UDP 包

     try {        socket.setSoTimeout(5000);  ////设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效                 String re = "";                try {        while (true) {        re = re + "[";                socket.receive(receivePacket);        repacs=receivePacket.getData();        int effLength=receivePacket.getLength();        repac=new byte[effLength];                        for (int i = 0; i < effLength; i++) {                re = re + to16(repacs[i]);        }                re = re + "]";}        }catch (Exception e) {    // TODO: handle exception        }                socket.close();        re=re.substring(0, re.length()-1);        System.out.println("result--->" + re );          return re.toString();     } catch (Exception e) {// TODO: handle exception     }     socket.close();

更多相关文章

  1. Android 使用内容解析者往短信数据库里插入一条数据
  2. Android Handler不同界面发送数据
  3. Android之SharedPreferences轻量数据存储
  4. android中数据存储的contentprovider的使用方法
  5. android 模拟器获取root权限的方法
  6. android 利用Gson生成json数据
  7. Android中json操作数据的使用
  8. Android 模拟器检测记录
  9. Android 数据存储与读取:文件

随机推荐

  1. Android 原生加载框
  2. Activity去掉标题栏失败(使用AppCompat)
  3. 点击button然后改变其中文字的颜色
  4. android getResources的作用
  5. 在Android中通过代码切换到指定 WiFi
  6. Android通过http协议POST传输方式
  7. Android 系统菜单与自定义菜单
  8. android 安装 出现Android Native Develo
  9. Linux下Android ADB驱动安装详解
  10. Android从view得到bitmap及bitmap叠加和