草庐IT

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

coder 2023-09-17 原文

我面临以下困境:

设计一个新的网络协议(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/

有关java - 为实时数据/移动设备设计网络协议(protocol)的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  8. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐