gpt4 book ai didi

java - 为实时数据/移动设备设计网络协议(protocol)

转载 作者:可可西里 更新时间:2023-11-01 02:30:48 25 4
gpt4 key购买 nike

我面临以下困境:

设计一个新的网络协议(protocol),用于服务器(Java 软件)与桌面和移动客户端之间。移动客户端包括 J2ME、Android,也许在未来甚至是 iPhone。

数据流是一个实时的、恒定的流,也有更多不频繁的部分。客户端显示此数据的波形以及不需要立即更新的数据。客户端也应该经过身份验证。

如果可能,我想避免从头开始创建完全自定义的 TCP 协议(protocol)实现。

最近人们通常推荐以 REST 风格做所有事情,我也非常喜欢。在这种情况下,我有点犹豫:如何在 REST 之上实现恒定的数据流?分 block 的 HTTP 响应?

我也在考虑非明文协议(protocol)(我正在替换的当前协议(protocol)是二进制协议(protocol))。那些当前的协议(protocol)有相当严重的问题,所以他们真的应该被取代。

Google protocol buffers 看起来是处理低级细节的有力候选者,但我不确定它是否可以在 Android 中使用。而且我很确定 iPhone 的实现也会有问题。

还有 BEEP ,但我认为它几乎已经死了,我想知道它是否曾被广泛使用。

有什么想法吗?

最佳答案

我认为在开始协议(protocol)设计之前,您应该非常仔细地处理以下问题:

  • 如今,除 HTTP 外,几乎所有协议(protocol)都被防火墙过滤。甚至许多内容类型和端口(80 除外)也可能被服务提供商过滤,尤其是在移动数据服务中。因此,在选择使用或设计协议(protocol)之前,请确保目标网络中没有防火墙问题。
  • 大小和速度很重要。尝试在传输消息大小和编码/解码(序列化/反序列化)速度方面使用高效的协议(protocol)。 Google Protocol Buffers为这个问题提供了可靠的解决方案。
  • 连接总是断开。由于 NAT 超时(默认为 15 分钟)、协议(protocol)超时(TCP 为 30 分钟)和许多现有网络问题,您永远不能依赖连接长时间保持打开状态.因此,不要仅仅因为协议(protocol)保持连接打开(它可能会尝试,但永远不会成功)而不喜欢另一个协议(protocol)。发送心跳是解决超时问题的一个很好的尝试,但仍然无法避免网络断开。
  • 吞吐量很重要。吞吐量是指在一段时间内(例如 1 秒)处理的消息数。使用在收到消息后断开客户端连接的异步协议(protocol),确实有助于提高吞吐量。尽管不依赖于从服务器连接到客户端来推送结果,因为许多客户端位于 NAT 和防火墙后面,避免了从外部直接连接。尝试保持连接打开或轮询服务器以获取结果。避免 session 中的状态也是随着客户端数量的增长而帮助扩展应用程序吞吐量的另一种方法。
  • 在现有的 WAN 中没有实时性。不要相信那些声称他们已经实现了基于现有广域网协议(protocol)的实时协议(protocol)的人。您永远无法在非实时协议(protocol)之上实现实时协议(protocol)。您可以尽力而为,并祈祷网络快速发展。这意味着:不要停下来,尽力而为。
  • Non-Blocking IO. NIO(Non-blocking IO)是现在的趋势,有效地用于网络编程。它以较少的内存使用和有限的线程数启用大量连接。 Java 5 原生支持非常原始的 NIO。许多框架,例如 Apache MINANetty , 已经基于 Java NIO 实现,使非阻塞编程更容易和更健壮。我强烈推荐他们。

关于java - 为实时数据/移动设备设计网络协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2080421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com