Android 设备接收 UDP 广播时丢包

2023-11-22

为了从服务器接收 UDP 广播数据包到 Android 设备,我使用了一个服务类并在线程中侦听数据包。成功接收数据包。问题是,如果服务器同时发送多个数据包,则会导致数据包丢失。

我什至尝试使用队列并在单独的线程中处理接收到的数据包,然后我也没有收到数据包。我对网络编程完全陌生,任何帮助将不胜感激

void startListenForUdpBroadcast() {
        UDPBroadcastThread = new Thread(new Runnable() {
            public void run() {
                try {
                    InetAddress broadcastIP = InetAddress.getByName(UdpConstants.IP_ADDRESS);
                    Integer port = UdpConstants.RECEIVER_PORT;
                    while (shouldRestartSocketListen) {
                        listenAndWaitAndThrowIntent(broadcastIP, port);
                    }

                } catch (Exception e) {
                    Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage());
                }
            }
        });
        UDPBroadcastThread.setPriority(Thread.MAX_PRIORITY); //Setting The Listener thread to MAX PRIORITY to minimize packet loss.
        UDPBroadcastThread.start();
    }

此代码侦听新数据包并将其推送到队列

private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception {
        byte[] recvBuf = new byte[64000];
        if (socket == null || socket.isClosed()) {
            socket = new DatagramSocket(port, broadcastIP);
            socket.setBroadcast(true);
        }
//socket.setSoTimeout(1000);
        DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);

        socket.receive(packet);
        messQueue.add(packet);

    }

这会检查队列中是否有新消息并对其进行处理

 /**
     * @purpose Checking queue and If anything is added to the queue then broadcast it to UI
     */
    private void checkQueue() {
        queueThread = new Thread(new Runnable() {
            public void run() {
                try {

                    while (shouldRestartSocketListen) {
                        if (!messQueue.isEmpty()) {
                            broadcastIntent(messQueue.poll());
                        }
                    }

                } catch (Exception e) {

                }
            }
        });
        queueThread.start();
    }

UDP 的问题是你的发送者(你的服务器)不知道你(你的 Android 设备)错过了一些。它不会丢失,因为您无法足够快地读取它,有时只是通过空中干扰/拥塞或繁忙的套接字。

接收者只会知道:

  1. 由于缺少数据,因此在处理数据时出现错误
  2. 或者您的 UDP 数据包在其标头中按顺序编号,并且您检测到丢失的数字(例如 1,2,4 - 丢失 3)

一旦数据包丢失,它就丢失了。你有两个选择:

  1. 实现重发请求:在检测到丢失的数据包后,接收方需要通知发送方重新发送该丢失的数据包,直到收到它为止,并且您的数据包处理可能会停止,直到收到为止
  2. 或者能够忽略它,“嘿,我们可以在没有他的情况下做到这一点”,并填充空白数据(例如,位图会有一些空白像素,就像损坏的图像)
  3. 降低发送速度,这样数据包就不会堵塞和丢失
  4. 您的包裹越小,它们存活的可能性就越大

(选项 1:所有这些重发请求只是伪 TCP,因此您可能会考虑放弃 UDP 并转而使用 TCP)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 设备接收 UDP 广播时丢包 的相关文章

  • Android 中读取未提交的事务

    我正在进行大量数据库操作 这会向我的数据库添加大约 10 000 条记录 由于这可能需要很长时间 因此最好使用事务 db startTransaction do write operations db setTransactionSucce
  • Android 中的短信编码

    我的问题是我想发送特定类别和特定编码的短信 0 类和 7 位编码 当检查 Android Telephony SmsManager 和 SmsMessage 时 您无能为力 SmsManager 提供两个功能 发送文本消息和发送数据消息 如
  • Android Wear:在手持设备上启动服务

    我正在构建一个 Wear 应用程序 它将与手持设备上的 WearableListenerService 进行通信 但是 我想确保当应用程序在手表上启动时服务已启动并运行 我最初的想法是发送意图或广播消息来启动服务 但是 我一直无法弄清楚如何
  • 将片段部分移出屏幕

    我已经被这个问题难住有一段时间了 我试图将包含在 FrameLayout 中的片段向右移动 以便只有片段的左侧 20 可见 我认为我遇到的问题是父级不会让片段移出其边界 或者我不知道如何移动它 我所尝试的一切只是将片段推到右墙上 然后缩放片
  • 未找到 Google 地图 api v2 类

    我正在使用谷歌地图 api v2 一切正常 今天早上我更新了 sdk 现在地图无法工作 尝试了很多事情 例如再次导入 lib 项目 但似乎没有任何效果 请帮忙 这是 logcat 输出 05 16 08 53 34 327 E dalvik
  • Android Surface 与 Canvas 的关系

    Surface 和 Canvas 之间到底是什么关系 请解释 表面是一个缓冲区 画布保存绘图 视图未附加到画布 也不是表面 窗户被绑在 Surface 和 ViewRoot 询问 随后使用的画布表面 通过要绘制的视图 详细答案你可以阅读这篇
  • 在我授予许可后,表面视图不显示相机

    public View onCreateView LayoutInflater inflater Nullable ViewGroup container Bundle savedInstanceState View view inflat
  • cordova - 删除不必要的权限

    我需要在游戏中播放声音 因此我将 org apache cordova media 插件添加到我的应用程序中 现在platforms android AndroidManifest xml包含2个我不需要的条目
  • 无法从视图转换为按钮

    我在这里遇到非常令人沮丧的问题 我有这个代码 Button b findViewById android R id button1 我收到了这个错误 类型不匹配 无法将表单视图转换为按钮 但是按钮1is一个按钮 在我的 XML 布局文档中
  • Android 上 WebRTC 的自定义视频源

    Overview 我想使用自定义视频源通过 WebRTC Android 实现来直播视频 如果我理解正确的话 现有的实现仅支持 Android 手机上的前置和后置摄像头 以下类与此场景相关 Camera1Enumerator java ht
  • Android“权限拒绝:无法使用相机”

    我正在学习有关在 Android 应用程序中使用相机的教程 我收到错误 权限被拒绝 无法使用相机 在模拟器和物理设备上运行调试时 我在清单文件中尝试了各种权限 似乎大多数遇到此错误的人都遇到了拼写错误 缺少权限或权限不在清单中的正确位置 这
  • Textview 第一次点击时为空,但第二次点击时更新

    它是使用兼容性包的小型 Android 2 2 测试应用程序 我正在尝试更新列表项选择上另一个活动的另一个片段上的文本视图 但问题是 每次第一次单击都会返回空指针异常 并且只有在第二次尝试时 其文本才会更改 我想知道为什么会发生这种情况以及
  • XML 文档结构必须在同一实体内开始和结束

    我是 eclipse 的新手 我刚刚开始编写一些代码 实际上只是从网站复制并粘贴 谁能帮我解决这个问题 错误出现在最后一行
  • Android图层列表不显示比例可绘制项目?

    使用下面的图层列表 我的比例绘制从未显示 这是为什么 菜单 对话框 标题 xml
  • 为什么我的字体大小在 android webview 对象中看起来比在 android 浏览器中查看时大得多?

    我正在尝试制作一个小型 Android 应用程序 它除了在 webview 对象而不是浏览中显示网站之外什么也不做 到目前为止它加载了目标网页 但文本和图像大小都比查看页面时大得多在实际设备浏览器中 在浏览器中 页面看起来正确 但在我的应用
  • Android 中可以导入 java.rmi.* 吗?

    我的分布式系统课程中有一个项目 我们必须在我们的项目中使用 java rmi 而且我知道由于 dalvik VM 问题 android 不提供这个库 所以我只是想问是否可以在 Android 上使用这些库 Thanks Android 不支
  • Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0)

    一段时间以来 我在 Android 游戏中遇到了运动精灵间歇性 卡顿 的情况 这是一个非常简单的 2D OpenGL ES 2 0 游戏 这是一个持续存在的问题 我已经多次重新访问过 在我的游戏循环中 我有 2 个 计时器 一个用于记录前一
  • API 24 AccessibilityService.dispatchGesture() 方法如何工作?

    通过 API 24 我们有了一种向设备发送手势的方法 但是目前还没有可靠的文档或示例 我正在尝试让它工作 但目前手势每次都会点击 onCancelled 回调 这是我调用该方法的代码 TargetApi 24 private void pr
  • Android - onLoadFinished 未调用

    我遇到了装载机的问题 我有一个活动 它显示从本地数据库检索的记录列表 当活动启动时 记录会通过 LoaderManager initLoader 方法自动加载 还可以通过 ActionBarSherlock 中的刷新按钮手动刷新列表 但是
  • PinnedHeaderListView 滚动和标题问题

    背景 我正在尝试模仿 Lollipop 的联系人应用程序显示联系人首字母的固定标题的方式 正如我所写的here https stackoverflow com q 27621425 878126 问题 由于原始代码 发现here http

随机推荐

  • Jetpack Compose Navigation - 将本地文件位置作为字符串传递

    我正在尝试传递音频文件位置 storage emulated 0 Android media 作为第一个屏幕中的字符串home screen到第二个屏幕detail screen 当我正常传递上面的字符串作为参数时 我收到此错误 java
  • Python 进程使用的总内存?

    Python 程序有没有办法确定它当前使用了多少内存 我看过关于单个对象的内存使用情况的讨论 但我需要的是该进程的总内存使用情况 以便我可以确定何时需要开始丢弃缓存数据 Here是一个有用的解决方案 适用于各种操作系统 包括 Linux W
  • fetch response.text() 返回待处理的承诺

    我使用 jsonplaceholder URL 测试 fetch API 但我的函数返回 Promise State Pending 我不明白为什么 function getUsers url return fetch url const
  • CSS:删除选择元素内的填充

    我试图从选择元素中删除填充 以便其中的文本与其正下方的输入元素中的文本对齐 除其他外 我还尝试过以下操作 select padding left 0 有任何想法吗 JS小提琴在这里http jsfiddle net pLSkH 2 去除te
  • 当应用程序在后台运行时,如何让我的 AVPlayer 播放?

    我已经完成了我的作业 一直在阅读这里的文档 谷歌搜索 stackoverflowing 但是当用户让应用程序进入后台时仍然无法让我的声音保持不变 到目前为止我所做的 将 UIBackgroundModes 音频添加到 plist 文件中 首
  • 如何搜索redis哈希中的关键模式?

    我有一个哈希表 其键的模式为 USER TEL 如下所示 bob 123456 Some address mary 567894 other address john 123456 third address 现在 我想获取密钥中具有相同电
  • 使用 atos 通过 dSYM 确定崩溃的方法名称

    我有一个来自用户的控制台堆栈 不是崩溃报告 我试图确定我的应用程序中的哪个方法调用是最后一个站着的人 我知道他们使用的是哪个版本的应用程序 并且我有该发布 调试版本的副本 以及存档副本的 dSYM 文件 但是 当我尝试使用atos吐出内存地
  • React Native 响应式字体大小

    我想问一下如何反应原生处理或做响应式字体 例如 在 iphone 4s 中 我的 fontSize 14 而在 iphone 6 中 我的 fontSize 18 您可以使用像素比 例如 var React require react na
  • SELECT * INTO 在 SQL Server 2008 中保留 ORDER BY,但在 2012 中不保留

    在2008年和2012年执行以下SQL 在2008年执行时 返回的结果是正确的排序顺序 2012 年 排序顺序不再保留 这是已知的变化吗 2012 年是否有保留排序顺序的解决方法 CREATE TABLE MyTable Name VARC
  • 连接在不活动一段时间后挂起

    在我的应用程序中 Spring 管理用于数据库访问的连接池 Hibernate 使用这些连接进行查询 乍一看 我对池没有任何问题 它可以在并发客户端和只有一个连接的池中正常工作 我可以执行很多查询 所以我认为我 或Spring 不会留下开放
  • 使用layout_gravity =“bottom”放置在LinearLayout的底部

    我想在 LinearLayout 的底部放置一个布局 但我似乎无法让它工作 我知道我可以使用RelativeLayout来做到这一点 但我应该能够使用LinearLayout 不是吗 EDIT 事实上这比我想象的更令人困惑 下面的布局已简化
  • 使用折叠工具栏和选项卡滚动

    我正在尝试制作一个布局CollapsingToolbarLayout其中有scroll exitUntilCollapsed标志 和一个TabLayout其中有scroll enterAlways滚动标志属性 基本上我希望我的工具栏被固定并
  • Keras 中每个时期的训练准确性是如何确定的?

    我正在 Keras 中训练一个模型 如下所示 model fit Xtrn ytrn batch size 16 epochs 50 verbose 1 shuffle True callbacks model checkpoint val
  • 是否可以关闭/管理 IIS 上的 SSL 连接/会话?

    我试图找出 IIS 中是否有某种 API 或控件允许我以某种方式控制 SSL 会话 例如关闭会话或要求重新身份验证 底线我问是否有人知道管理从 C 到 IIS 7 的 SSL 连接的方法 类似于 Tomcat 7 的方法 Invalidat
  • 无法选择 UIAlertController 中的按钮顺序

    我的印象是 如果正常操作是破坏性操作 而另一个是 UIAlertController 中的取消操作 则破坏性操作应该位于左侧 取消操作应该位于右侧 如果正常操作不是破坏性的 那么正常操作应该在右侧 取消应该在左侧 也就是说 我有以下内容 v
  • 使用 Sass 的媒体查询无法编译

    我在使用媒体查询混合编译 Sass 文件时遇到错误 我遵循了几个教程 但它无法编译 我在用着Sass 3 3 0 alpha 67 Bleeding Edge 这是我的代码 Included at the end mixin mobile
  • 在类内部使用比较函数进行 sort() 时出现问题

    如果你看一下我在类中的函数 CardCompare 它不起作用 但是 如果我改用 Hand cpp 中注释掉的函数 它就可以正常工作 为什么是这样 另外 我想知道将 CardCompare 函数保留在我的 hand 类中是否比将其保留在 C
  • 如何使用 Firefox 操作系统在后台播放音频?

    在我的清单文件中 我在权限中添加了音频通道内容 permissions audio channel content description Use the audio channel for the music player 在我的 ind
  • 无法捕获 fn 项目中的动态环境

    在此代码中 一切正常 除了task id 我希望这个脚本能够计算请求数task id use std thread use std thread sleep ms use std sync mpsc macro use extern cra
  • Android 设备接收 UDP 广播时丢包

    为了从服务器接收 UDP 广播数据包到 Android 设备 我使用了一个服务类并在线程中侦听数据包 成功接收数据包 问题是 如果服务器同时发送多个数据包 则会导致数据包丢失 我什至尝试使用队列并在单独的线程中处理接收到的数据包 然后我也没