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程序设计有所帮助。

(0)

相关推荐

  • Android中实现TCP和UDP传输实例

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified).在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能.应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP

  • android模拟器开发和测试nfc应用实例详解

    从Android2.3开始支持NFC.不过NFC应用只能在Android手机(或平板电脑)上测试和开发,而且Android手机还必须有NFC芯 片.而且如果测试NFC传输文件时至少需要两部支持NFC的手机.当然,如果测试读写NFC标签,还需要一些NFC标签或帖子.而且NFC在模拟器上时不能运行的.所以从这一点来说,NFC开发需要更多的设备,比较麻烦.这也蓝牙.传感器是一样的.都不能在Android模拟器上开发和测试.真不知道Google为什么不解决这一问题. 不过这种问题也不是不能解决,而且并不

  • android开发socket编程之udp发送实例分析

    本文实例讲述了android开发socket编程之udp发送实现方法.分享给大家供大家参考.具体分析如下: 需要实现的功能:采用udp下的socket编程,当按下确认键,模拟器发送文本框数据,pc机上的网络调试助手接收 一.环境: win7 + eclipse + sdk 二.代码: package test.soket; //import com.test_button.R; import java.io.DataOutputStream; import java.io.IOException

  • 解决Android模拟器端口被占用问题的办法

    一.问题描述 今天在Eclipse中运行Android项目时遇到"The connection to adb is down, and a severe error has occured"这个问题,如下图所示: 第一次遇到这个问题,上网查了一下原因,原来"The connection to adb is down, and a severe error has occured"指的就是Android模拟器端口被占用了. 二.问题的排查过程 既然是端口被占用了,现在

  • android的UDP编程实例

    一.有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了.1.可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock:具体如下: 复制代码 代码如下: WifiManager manager = (WifiManager) this                .getSystemService(Context.WIFI_SERVICE);WifiManager.MulticastLock lock= manag

  • Android网络编程之UDP通信模型实例

    什么是Android UDP? UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.它是IETF RFC 768是UDP的正式规范.在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层-传输层,处于IP协议的上一层.UDP有不提供数据报分组.组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的.UDP用来支持那些需要在计算机之间传输数据

  • Android编程实现基于局域网udp广播自动建立socket连接的方法

    本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法.分享给大家供大家参考,具体如下: android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中间一定需要用到socket来进行通信.今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸. 要想使用socket进行通讯,就必须知

  • Android编程实现简单的UDP Client实例

    本文实例讲述了Android编程实现简单的UDP Client.分享给大家供大家参考,具体如下: 该代码在4.2.2内调试通过 1.记得加权限 <uses-permission android:name="android.permission.INTERNET"/> 注意:Android 4.0之后,就不能在主线程进行socket通信,否则会抛异常. 2.代码 MainActivity.java: package mao.example.quicksend; import

  • 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 Datagr

  • 详解PyQt5 GUI 接收UDP数据并动态绘图的过程(多线程间信号传递)

    目录 1. Qt 的用法 2. Pycharm 设置 2.1 安装 Pyqt5 和 pyinstaller 包 2.2 Pycharm pyqt工具配置 3 UDP图形界面设计 3.1 GUI设计 3.2 将GUI文件转换为py文件 3.3 widget窗体提升,整合matplotlib的功能 3.4 GUI 设计结果 4 多线程编程UDP通讯 4.1 信号和槽函数 4.2 多线程 5 Pyinstaller 打包成exe 1. Qt 的用法   pyqt5是qt的python版本,其主要是以对

  • PowerShell脚本开发之收发UDP消息包

    在上篇文章中,在PSNet工具集中创建了Send-TCPMessage和Receive-TCPMessage两个函数实现了通过PowerShell收发TCP消息包的功能,有了TCP包的发送和接收,自然少不了UDP消息包的发送和接收,本文将会介绍通过PowerShell发送和接收UDP消息包的方法. 为了能跟之前的PSNet程序集匹配,继续基于此程序集进行扩展,在$env:PSSpace\PSNet下创建UDPOp目录,在其中创建Receive-UDPMessage.ps1和Send-UDPMes

  • Fiddler如何抓取手机APP数据包

    Fiddler,这个是所有软件开发者必备神器!这款工具不仅可以抓取PC上开发web时候的数据包,而且可以抓取移动端(Android,Iphone,WindowPhone等都可以). 第一步:下载神器Fiddler,下载链接: http://w.x.baidu.com/alading/anquan_soft_down_ub/10963 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler 打开Fiddler, Tools-> Fiddler Options (配置完后记得要重启Fiddl

  • 在Linux中使用tcpdump命令捕获与分析数据包详解

    前言 tcpdump 是一个有名的命令行数据包分析工具.我们可以使用 tcpdump 命令捕获实时 TCP/IP 数据包,这些数据包也可以保存到文件中.之后这些捕获的数据包可以通过 tcpdump 命令进行分析.tcpdump 命令在网络层面进行故障排除时变得非常方便. tcpdump 在大多数 Linux 发行版中都能用,对于基于 Debian 的Linux,可以使用 apt 命令安装它. # apt install tcpdump -y 在基于 RPM 的 Linux 操作系统上,可以使用下

  • 在Android 模拟器上安装和卸载APK包的方法

    模拟器(emulator.exe) 可以在 Android SDK 的安装目录下的 tools 文件夹找到运行文件(F:GPhoneandroid-sdk-windows-1.0_r1 ools),双击运行模拟器. 安装 APK 包 adb install [-l] [-r] - push this package file to the device and install it<'-l' means forward-lock the app><'-r' means reinstall

  • Python3 串口接收与发送16进制数据包的实例

    如下所示: import serial import string import binascii s=serial.Serial('com4',9600) s.open() #接收 n=s.inwaiting() if n: data= str(binascii.b2a_hex(s.read(n)))[2:-1] print(data) #发送 d=bytes.fromhex('10 11 12 34 3f') s.write(d) s.close() 以上这篇Python3 串口接收与发送1

  • Python选择网卡发包及接收数据包

    当一台计算机上有多个网卡时,需要选择对应IP地址的网卡进行发送数据包或者接受数据包. 1.选择网卡发包(应用scapy): plface=conf.route.route("××.××.××.××")[0] #××.××.××.××为对应网卡网络中存在设备的IP地址.不能是需要发送数据包的网卡的IP地址(会报"result too large") pkt=conf.L2socket(plface) pack_ip,pack_udp,pack_ether=self.u

  • Android实现注册页面(携带数据包跳转)

    安卓学习:实现注册页面输入数据,点击注册按钮跳转到另一个页面并显示输入信息 效果: 实现 1.创建安卓文件 2.创建注册界面,勾选为启动页 3.编写代码 启动界面activity_register11.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

随机推荐