ref:http://blog.chinaunix.net/uid-20771867-id-3416509.html
         cmd:telnet localhost 5554
        redir add udp:8002:8001 (将PC 8002端口映射为模拟器 8001端口)
         模拟器-SERVER:ServerSocket server = new ServerSocket(8001);//zcl:7100改为2888
            public static void ReceiveUDP() throws IOException {
             // TODO Auto-generated method stub
ReliableUDP udp = new ReliableUDP(null, "172.17.21.231", 8001, 8001);
             byte[] revBuf = new byte[1024];
             int res = udp.ReadFixedLength(revBuf, 1);
            }                     
         PC-CLIENT:Socket socket = new Socket("127.0.0.1", 8002); 
          《TCP/UDP测试工具》 UDP:127.0.0.1 port 8002 (注意:8002是PC的映射端口)

ok ——》 最终找到原因:是redir add会抢占端口:          
ok ——》解决方法:环境设置——关键是一定要使用remotePC,单靠本机无法实现调试

      +++++++++++++++++++++++++++++++++++++++++          +++++++++++++++++++++++++++++++++++++++++
+ localPC + + remotePC +
+ ip:172.17.22.8 + + ip:172.17.21.54 +
+ redir udp:: + + +
+ + + +
+ +++++++++++++++++++++++++++++ + + +
+ + android vm + + + +
+ + + + + +
+ + + + + +
+ + send(DestIP=remotePC, + + + Receive(localPort=) +
+ + localPort=) + + + +
+ + DestPort=) + + + +
+ + --------------------------------------> -
+ + + + + +
+ + + + + +
+ + Receive(localPort=), + + + send( DestIP=localPC +
+ + + + + localPort=) +
+ + + + + DestPort=) +
+ + + + + +
+ + <----------+---<----------+----- +
+ + + + + +
+ + + + + +
+ +++++++++++++++++++++++++++++ + + +
+ + + +
+++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++

ok ——》code:
   public class LEDControlerDriver {
    public static void SendUDP() {
     // TODO Auto-generated method stub
     ReliableUDP udp = new ReliableUDP(null, DestIP, 8001, 8001);//to lydsw 前一个8001是模拟器-SERVER port,后一个8001是pc 接收消息的port,注意!不是pc映射给模拟器的端口(8002)
     String s= "32323213";
     int res = udp.SendFixedLength(s.getBytes(), s.length()); 
     
    }
    
    public static void ReceiveUDP() throws IOException {
     // TODO Auto-generated method stub
     ReliableUDP udp = new ReliableUDP(null, DestIP, 8001, 8001);//to lydsw 前一个8001是模拟器-SERVER port,后一个8001是pc 接收消息的port,注意!不是pc映射给模拟器的端口(8002)
     byte[] revBuf = new byte[1];
     int res = udp.ReadFixedLength(revBuf, 1);
    }
                 
   public class ReliableUDP {
    public int SendFixedLength(byte[] sendBuf,int nSendLen){
     Log.i("UDP Demo", "发送数据(1):");
     // check
        int res = 1;
        if (sendBuf.length!=nSendLen) {
      return -2;
     } 
       
        // create socket
        DatagramSocket socket = null;
     try {
      socket = new DatagramSocket(null);   // 指定Null很重要,否则Java会自动随机选个可用端口来绑定
      socket.setReuseAddress(true); // DatagramSocket的setReuseAddress(true)方法执行后,可以允许多个DatagramSocket
              // 绑定到相同的IP地址和端口,那么发送到此IP地址和端口的数据能够被复制到多个DatagramSocket
      socket.setSoTimeout(10000);
      socket.bind(new InetSocketAddress(this.LocalPort)); 
     } catch (SocketException e) {
      Log.i("UDP Demo", "SendFixedLength:socket create failed1:"+e.getMessage());
      return -3;
     }     
       
        Log.i("UDP Demo", "发送数据(2):");
        // 定义一个用于发送的DatagramPacket对象 
        DatagramPacket outPacket = null;
        try {
                outPacket = new DatagramPacket(sendBuf , nSendLen  , InetAddress.getByName(this.IPaddr) , this.TargetPort); 
                   socket.send(outPacket); 
                   Log.i("UDP Demo", "SendData:UDP发送数据:"+StringHexbyteTransform.bytesToHexString(sendBuf));
     } catch (IOException e2) {
      Log.i("UDP Demo", "SendData:io failed:"+e2.toString()+":"+e2.getMessage());
      res = -52;
     }  
       
        socket.close();
        return res;
    }
                                                   
                                                  
    public int ReadFixedLength(byte[] revBuf,int nRecvLen, int timeout)
    {
     Log.i("UDP Demo", "Read数据(1):");
     // check
        int res = 1;
        int len = nRecvLen;
        if (-1 == nRecvLen) {
         len = revBuf.length;
     } 
       
        // create socket
        DatagramSocket socket = null;
     try {
      socket = new DatagramSocket(null);   // 指定Null很重要,否则Java会自动随机选个可用端口来绑定
      socket.setReuseAddress(true); // DatagramSocket的setReuseAddress(true)方法执行后,可以允许多个DatagramSocket
              // 绑定到相同的IP地址和端口,那么发送到此IP地址和端口的数据能够被复制到多个DatagramSocket
      socket.setSoTimeout(timeout);
      socket.bind(new InetSocketAddress(this.LocalPort)); 
     } catch (SocketException e) {
      Log.i("UDP Demo", "SendFixedLength:socket create failed1:"+e.getMessage());
      return -3;
     }     
       
        Log.i("UDP Demo", "Read数据(2):");
        // 定义一个用于发送的DatagramPacket对象 
        DatagramPacket inPacket = null;
        try {
          inPacket = new DatagramPacket(revBuf , len);
          socket.receive(inPacket); 
          ExpandRevBuffer(revBuf);
                   Log.i("UDP Demo", "receive:"+StringHexbyteTransform.bytesToHexString(revBuf)); 
     } catch (IOException e2) {
      Log.i("UDP Demo", "SendData:io failed:"+e2.toString()+":"+e2.getMessage());
      res = -52;
     }  
       
        socket.close();
        return res;
    }

DatagramSocket总是发送UDP数据后无法接收数据的更多相关文章

  1. Android上UDP组播无法接收数据的问题

    最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...

  2. sql server中新增一条数据后返回该数据的ID

    开发中遇到的问题:在新增一条数据后往往不需要返回该数据的ID,但是有的时候可能需要返回该数据的ID以便后面的编程使用. 在这里介绍两种方法: 其一:使用存储过程: create procedure a ...

  3. JQuery Ajax 发送请求成功后却接收不到任何响应数据问题

    问题描述 使用 JQuery Ajax 向后端服务器发送请求,服务器也收到请求返回了响应数据,但是 Ajax 却收不到任何响应数据. 举例如下: $.ajax({ type: "post&q ...

  4. QTcpSocket的连续发送数据和连续接收数据

    关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读.本以为 ...

  5. sql清空表数据后重新添加数据存储过程

    ALTER PROCEDURE [dbo].[sp_add_Jurisdiction] @CTableName varchar(20), --当前要删除.新增的表 @filedkeyValue var ...

  6. Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

    1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接 ...

  7. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

  8. Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

    1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...

  9. android蓝牙(二)——接收数据

    在蓝牙开发中,我们有这种一个需求:我们的androidclient要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,androidclient就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持an ...

随机推荐

  1. react-native 常用组件的用法(二)

    ScrollView组件 能够调用移动平台的ScrollView(滚动视图)的组件,同时还集成了触摸锁定的“响应者”系统.注意一定要给scrollview一个高度,或者是他父级的高度. 常用方法 on ...

  2. 10分钟-jQuery-基础选择器

    1.id 选择器 jquery能使用CSS选择器来操作网页中的标签元素.假设你想要通过一个id号去查找一个元素,就能够使用例如以下格式的选择器: $("#my_id") 当中#my ...

  3. springMVC 【@response 返回对象自动变成json并且防止乱码】 & 【配置支持实体类中的@DateTimeFormat注解】

    在springmvc的配置文件中加上这一段即可 <bean class="org.springframework.web.servlet.mvc.annotation.Annotati ...

  4. git个人使用总结(界面版)

    最近开始使用GIT来管理测试文档,从0到1开始使用git 1.首先,使用网页登录GIT后,创建项目 2.创建项目后,需要配置一下访问者权限 3.然后在网页版GIT复制地址,git clone到 本地 ...

  5. 排序算法 C++代码实现

    插入排序: 就像摸牌,摸一张插进去,找一个哨兵.从第二个開始,和前一个比較.小的话前移一位. #include <iostream> #include<stdlib.h> us ...

  6. 涛哥的Python工具箱之批量删除含指定字符串行

    我们在软件研发中不可避免的要用到大量的反复性的繁琐的工作,比如批量改动代码中接口的字符串.批量下载文件并又一次按规则命名.这些工作人工做特别累,尤其是对我这样的懒人来说. 对于一个出色的程序猿来说,反 ...

  7. docker 查看容器挂载的目录

    $ docker inspect container_name | grep Mounts -A 20

  8. Atitit. 如何判断软件工程师 能力模型 程序员能力模型  项目经理能力模型

    Atitit. 如何判断软件工程师 能力模型 程序员能力模型  项目经理能力模型 这里能力模型的标准化是对工具的使用为基本 工具(ide,语言,类库,框架,软件) 第一步 ::可使用api 类库 框架 ...

  9. [译]GLUT教程 - 键盘

    Lighthouse3d.com >> GLUT Tutorial >> Input >> Keyboard GLUT可以让应用程序自动监测键盘输入,包括普通按键和 ...

  10. 用PreferenceActivity做一个标准的设置界面

    最后接触到一个任务,做一个工厂设置,在我看来工厂设置不需要多美观,但是一定要方便修改,添加功能,再就是使用方便,我就想到了用PreferenceActivity,android系统的settings就 ...