ndroid模拟器无法接收UDP数据包

==========================android模拟器无法接收UDP数据包========================

代码如下:
       DatagramPacket pack = null;
       DatagramSocket mail_data = null;
       byte receiver[] = new byte[100];
       try { 
           pack = new DatagramPacket(receiver,receiver.length); 
           mail_data = new DatagramSocket(22221); 
           mail_data.receive(pack);
           } 
           catch (Exception e) {
               e.printStackTrace();
           }
 
      receive函数接收不到数据,一直在等待。

解决方法:
1. 运行模拟器
2. 打开window 命令行
    执行:telnet localhost 5554
   5554是模拟器的端口,执行之后会进入android console
3. 在console下执行:
   redir add udp:22221:22221
   其中,第一个端口号是PC的端口,第二个端口号是模拟器端口。(端口映射)
   执行此命令之后,会把PC 22221 端口接收到的数据转到模拟器的22221端口,就能从22221端口接收UDP数据包了

也就是说:Android模拟器上的程序UDP接收端口要设为22221,PC服务端要往PC的IP+端口22221发UDP数据包。

此时,PC的22221端口被占用。

ndroid模拟器无法接收UDP数据包_第1张图片

===========================接收到的UDP数据包长度大小==========================

由于传输协议基于protocol buffer,接收到的数据包是动态变化的,而java数据包接收要先定义byte[]大小,这样接收到的数据报长度变为固定了, 于是接收到的数据报在反序列化的时候屡屡报错。 

解决方法:利用DatagramPacket.getLength()可以截获实际数据报大小,重新定义一块该大小的byte[]反序列化就可以了。

  1.     public static void main(String[] args) throws IOException {   
  2.         System.out.println("等待接受");   
  3.         DatagramSocket datagramSocket = new DatagramSocket(8080);//指定接受信息的端口   
  4.         byte[] buf = new byte[1024];//指定最大接受信息的大小   
  5.         DatagramPacket datagramPacket = new DatagramPacket(buf, 1024);   
  6.         datagramSocket.receive(datagramPacket);//阻塞等待   
  7.         String string = new String(datagramPacket.getData(), 0,   
  8.                 datagramPacket.getLength())   
  9.                 + "  from  "  
  10.                 + datagramPacket.getAddress().getHostAddress()   
  11.                 + ":" + datagramPacket.getPort();   
  12.         System.out.println(string);   
  13.         datagramSocket.close();   
  14.     }

================================接收到的UDP数据包长度限制====================================

模拟器对数据包的大小有限制的!大于8k(模糊记得是8000多byte)左右以上的数据就收不到的。

经过定量分析,是8193byte,就是8K(8192byte),超过模拟器就接收不到。

在哪里被丢弃不详!

真机无限制。


http://blog.sina.com.cn/s/blog_82f2fc280101168z.html

你可能感兴趣的:(Android)