草庐IT

android - (Android、iOS、Windows、Linux)服务器轮询与推送与实现服务器

coder 2024-01-21 原文

我正在构建一个多操作系统镜像系统,我想使用混合客户端-服务器和 p2p 通信方法来实现(至少这是我描述它的最佳方式)。

我的问题是,在某些时候我有一个中央服务器(appengine,所以由于时间和网络能力的限制,我能做的事情受到限制)需要向许多不同的设备发送消息不一定运行相同的操作系统(Windows、Android、iOS、Linux 等)。

Android 和 iOS(或任何其他移动平台)是我将在两个层面上遇到的主要问题。

1 - 它们都受到电池电量的限制(笔记本电脑和台式机根本不应该有这个问题),所以无论我使用哪种方法都需要考虑到这一点。

2 - NAT(更难,因为用户对防火墙的控制比对他们正在运行的网络的控制要少)。我的中央服务器将维护一个表,其中包含哪些设备具有哪些 IP 地址,但据我了解,如果有 NAT 或防火墙,如果端口未转发,它将无法访问它。

由于我将为每个操作系统编写特定的客户端,因此我更喜欢更通用的解决方案。我一直倾向于编写一个极其简单的 HTTP 服务器,它位于每个客户端上并接收请求(appengine 能够发送)并将它们视为提醒客户端执行操作的消息(通过服务器或另一个客户端)。但是,我遇到了 NAT/防火墙的问题。例如,如果 appengine 需要向 AndroidDevice1 发送消息,它会从表中获取其 IP 地址并向其发出请求。但是,如果端口未正确转发,并且如果用户使用 3g/4g,则防火墙由数据提供商控制,这将不起作用。

因此,我开始考虑使用 Android C2DM,但我想要一个可以跨平台实现的解决方案。

我能想到的唯一其他方法是让客户端轮询服务器以获取消息。但是,这存在电池和网络消耗问题。

是否有任何其他方法来实现这一点,如果没有,上述哪一种方法在平衡可用性、功率和数据消耗以及用户输入方面最好(用户获得客户端所需要做的越少)设置(即端口转发等...)越好)?请注意,我不打算让这成为一场讨论/口水战,而是对事实的合乎逻辑的陈述。

提前致谢!

最佳答案

您可以创建从设备到服务器的持久 TCP 连接,然后通过此打开的连接进行通信。在大多数情况下,这将是与保持 Activity 数据包的非常简单的连接。

理论上这会通过 radio 消耗一些电池,但在实践中我发现电池根本不会受到太大影响。关键是尽量减少通过这条线路进行的通信。

如果 AppEngine 不允许这种方法,您可以运行自己的套接字服务器,然后使用 REST 在该服务器和 AppEngine 服务器之间进行通信。我使用的套接字服务器是 Apache MINA,在可扩展性方面没有问题。

使用此方法或任何其他方法时,您会遇到的另一个问题是,在 iOS (afaik) 上,当应用程序进入后台时,您无法保持 tcp 套接字打开。唯一与 iOS 设备通信的是 Apple Push Notification Service

关于android - (Android、iOS、Windows、Linux)服务器轮询与推送与实现服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9715002/

有关android - (Android、iOS、Windows、Linux)服务器轮询与推送与实现服务器的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  9. 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

  10. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

随机推荐