ios - UDP是否适合从iOS传输离散事件

标签 ios sockets tcp udp

我在检测到离散和连续手势时发送消息。对于连续的,UDP 应该没问题,因为即使丢失了几个数据包,也有很多变化事件,这应该无关紧要。

不过我想知道离散事件,例如点击或滑动。由于只会发送一个数据包,如果它没有到达并且另一端的应用程序没有收到手势通知的风险是什么?

我了解 TCP 保证传递,但我认为对于连续手势生成的高频率消息来说,它的开销可能太大。

最佳答案

如果您对 TCP 的唯一担心是额外的开销,那么我不会太担心。当然,TCP 比 UDP 有更多的开销。但是,开销并不那么,尤其是对于您可能要发送的少量数据而言。一些快速的粗略计算:

  • 假设您希望每毫秒发送一次状态信息。 (可能比您真正需要的次数更多。)

  • 假设您的个人消息可以很容易地容纳在每条 50 字节以内。 (可能比您真正需要的要大。)

  • 总带宽 50 字节/毫秒 = 400 位/毫秒 = 400 kbps

即使有这些大于必需的消息和快于所需的更新,您的总带宽也仅为较慢的 802.11b 无线网络的 5% 左右。 TCP 的额外开销在这里不太可能产生很大的不同。

就个人而言,除非有充分的理由不这样做,否则我倾向于坚持使用 TCP。当然,您可以通过使用 UDP 节省一些额外的位,但对我来说,可靠的交付(包括正确排序的数据、非重复数据)值得额外的开销。少了一件需要担心的事情。

编辑:TCP 确实有一些其他缺点。特别是,创建初始连接和解析字节流中的各个消息可能需要更多的编程工作。 UDP 无疑可以使这些任务更容易。但是,您没有将编程复杂性列为您的标准之一,所以我转而关注您的开销问题。

延迟:如以下评论所述,延迟是一个关键因素。在这种情况下,UDP 有一些显着的优势:如果一个数据包被丢弃,TCP 将等待该数据包被重新传输,然后再发送其他数据包。这种方法的好处是保证数据按原始顺序到达。 (当必须按顺序处理消息时,这是一个很大的优势。)当然,缺点是新数据可能会有明显的延迟。

另一方面,UDP 将继续发送后续数据包,即使一个数据包被丢弃。好消息是 UDP 减少了剩余数据包的延迟。不过,坏消息是您必须添加某种“重试”以防离散事件丢失——如果您这样做,您现在会遇到手势乱序的情况,可能会很明显所以。您的应用程序能否处理将“移动然后单击”更改为“单击然后移动”的情况?如果您选择采用 UDP 路线,则需要仔细考虑所有这些情况,以确保它不会在您的应用中引起(可能是细微的)问题。

关于ios - UDP是否适合从iOS传输离散事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520613/

相关文章:

C++:Linux:调用 write() 时 TCP/IP 程序崩溃

c# - 如何通过 TcpClient 获取页面?

ios - 无法将类型 'Swift.Array<Swift.Dictionary<Swift.String, Swift.String>>' () 的值转换为 'Swift.Dictionary<Swift.String, Any>' ()

iOS-从另一个类中的completionHandler block 访问 View 相关类

Java:将端口转发到 ServerSocket

python - 使用 Paramiko 无法忽略 socket.timeout 错误

java - 公共(public)ip套接字网络

C webserver中进程间的跨平台通信方式

iOS 二进制数据列未显示在 Sqlite 数据库中?

ios - 添加 View 。 Storyboard VS。以编程方式