Android模拟器接收UDP数据包的若干问题分析

本文实例分析了Android模拟器接收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端口被占用。

android模拟器接收UDP数据包的若干问题

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

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

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

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

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

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

经过定量分析,是8193byte,就是8K(8192byte),超过模拟器就接收不到。
在哪里被丢弃不详!

真机无限制。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android通信方式总结》、《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

时间: 2024-09-20 01:11:35

Android模拟器接收UDP数据包的若干问题分析的相关文章

Android模拟器接收UDP数据包的若干问题分析_Android

本文实例分析了Android模拟器接收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 Datagr

app-Android APP接收UDP数据出错

问题描述 Android APP接收UDP数据出错 /** * 接收数据线程 */ @Override public void run() { // TODO Auto-generated method stub try { while(!isStart); DatagramPacket dPacket = new DatagramPacket(reBuf, LEN); //InetAddress LocalAddr = InetAddress.getLocalHost(); //Log.e(T

发送数据-UDP数据包的发送顺序怎么确定?

问题描述 UDP数据包的发送顺序怎么确定? 我用UDP发送数据包,在连续发送的情况下,接收端怎么确定我的发送顺序? 有什么方法,还是在发送的时候要先添加序号? 解决方案 UDP 是无顺序的,先发的包不一定会先到,所以最好还是自己在协议中增加包的编号. 接收处理时,按无序的逻辑进行,这样就能正常完成数据的接收. 否则,就换 TCP 协议吧,它的顺序是可以保证的. 解决方案二: 自己编号自己编号自己编号 解决方案三: UDP没顺序,自己需要定义协议等来完成组包

关于socket udp 数据包传输时间的问题

问题描述 关于socket udp 数据包传输时间的问题 两台计算机型号和千兆以太网卡全部相同,其中一台计算机作为服务器端,另一台作为客户端,两者通过socket建立连接(udp连接),客户端单次向服务器端发送一百万数据包(每个数据包大小为1024字节),服务器端只接收不回应,则共耗时15秒左右,但若设置服务器端将每次接收到的数据包再原路传输回去,客户端发送一个数据包,再接收到一个数据包,则客户端发送一百万包的时间为650秒,请问两者的时间为什么相差这么大? 解决方案 socket之udp传输

android移动终端网络数据包的解析

问题描述 android移动终端网络数据包的解析 Android移动终端网络数据监控系统的设计与实现:网络数据包的解析,主要包括在移动终端生成网络数据包,然后将网络数据包发送给服务器端进行解析并进行资源文件(图片.文本.视频等)统计,最后将结果返回移动终端并在界面上显示. 请问该怎样实现? 解决方案 http://blog.csdn.net/carterjin/article/details/7571915

求救:java jpcap收发UDP数据包实例

问题描述 javajpcap收发UDP数据包实例.不要在网上down的代码.那些代码我都看过了.希望各位高手们能给我个注释比较详细的源码.如果帮到我了另外给分.邮箱:hehanjm@163.com急急急... 解决方案 解决方案二:高手..高手...求高手.小弟我很急啊...

android移动终端网络数据包的解析,要交给PC服务器端解析并传回来

问题描述 android移动终端网络数据包的解析,要交给PC服务器端解析并传回来 主要内容 :网络数据包的解析,主要包括在移动终端生成网络数据包,然后将网络数据包发送给服务器端进行解析并进行资源文件(图片.文本.视频等)统计,最后将结果返回移动终端并在界面上显示. 目标:在pc端完成网络数据包解析并将资源文件统计结果返回给移动终端, 分别从移动终端系统与服务器端系统两个方面对其进行设计与实现:移动终端基于Android系统实现良好的用户界面设计,服务器端采用MVC三层架构,构建相关数据库来存储网

介绍一个开源国产数据包生成与协议分析工具

问题描述 FinePacketBuilder(简称FPB)-开源国产数据包生成与协议分析工具,这是我从过年后一直在开发的工具软件,现在开发已经告一段落并且完全可以使用了.FPB是开源免费数据包生成与协议分析工具,同时还提供了著名的PCAP数据包截取软件包的Java封装.FPB具有独创的协议语法表示语言和通用CD(编码解码器)框架,能够方便地开发自己的协议解码器并已支持如下的内置协议:Ethernet,ARP,ICMPv4,IPv4,ICMPv6,IPv6,UDP,TCP,HTTP下面是FPB的一

有关读取UDP 数据包 不定长度的问题。

问题描述 大家好,我用php开启了一个UDPserver 客户端向服务器发送数据.收到后返回一个小信息.给大家看看基本的代码$pkt = stream_socket_recvfrom($socket, 100, 0, $peer);$reciv_data = fread($socket, 100);$message = preg_replace("/[[:space:]]/", '', $reciv_data); // cleanup data$response = "hel