用于移动客户端/服务器应用程序的基于套接字与 HTTP 的通信

Posted

技术标签:

【中文标题】用于移动客户端/服务器应用程序的基于套接字与 HTTP 的通信【英文标题】:Socket vs HTTP based communication for a mobile client/server application 【发布时间】:2011-03-17 03:52:46 【问题描述】:

我最近决定承担一个相当大的软件工程项目,该项目将涉及开发基于客户端-服务器的应用程序。我的计划是开发尽可能多的客户端:包括原生 iPhone、android 和黑莓应用程序以及基于 Web 的应用程序。

对于我的服务器,我计划使用 VPS(可能来自 slicehost.com)运行带有 mysql 数据库的 Linux 风格。我的第一个问题是我的客户端与服务器交互的策略应该是什么。我的想法是:

    使用 PHP 脚本进行基于 HTTP-POST 或 GET 的通信。 这是我非常熟悉的——将信息从表单传递到 php 脚本,使用它并返回输出。我假设我想将输出作为某种基于 XML 或 JSON 的字符串返回给客户端。我还假设我想为想要与我的服务器交互的客户端创建一个定义明确的 API。

    与 PHP 脚本、Java 程序或 C++ 程序的基于套接字的通信 这个我不太熟悉。我使用过有关创建脚本或创建套接字、侦听连接并返回数据的简单应用程序的基本教程。我假设与基于 HTTP 的方法相比,这种方法的通信数据开销要少得多。我的梦想是使用大量并发客户端,所有客户端都与服务器/数据库一起工作。我不确定一个简单的基于 HTTP/PHP 脚本的通信设计是否可以有效地扩展以满足许多客户的需求。此外,我最终可能想要由各种服务器事件触发的向客户端推送服务器的功能。我也不确定哪种编程语言最适合这个。如果效率是一个大问题,我想 PHP 脚本可能不够高效?

是否有一种普遍接受的方式来做到这一点?对我来说,这是试图弥合我目前的一些技能之间的差距。我在 PHP 和与 MySQl 数据库交互以提供动态网页方面有很多经验。我也有很多开发原生 iPhone 应用程序的经验(但是没有一个有任何重要的基于服务器的通信)。此外,我使用过 Java/C++,并且我开发了两种与 MySQL 交互的语言的应用程序。

我预计我的客户不会向/从服务器发送/接收大量数据。每个给定的客户端事件都与一组字符串相当。

另一个问题:使用 VPS - 好主意吗?我显然不想为完全专用的服务器付费(slicehost 提供的 VPS 起价约为 20 美元/月),并且我假设 VPS 将能够满足一些初始客户的要求。随着越来越多的用户开始与我的服务器交互,我假设可以迁移到越来越大的“切片”,并可能最终在必要时迁移到完全专用的服务器。

感谢您的建议! :)

【问题讨论】:

嗨,凯西。你最终选择了哪种方法?我的要求与您完全相同,我也想知道要实施哪些方法。 嗨@Johan,我不知道您的具体要求 - 但我绝对提倡使用 HTTP POST/GET 请求进行客户端/服务器通信。如果您正在开发在不同客户端上运行的移动应用程序,请考虑使用基于 Web 的移动应用程序框架,例如 sencha-touch 或 jquery mobile w/phonegap。随着手机和平板电脑变得越来越强大,原生应用程序和移动应用程序之间可辨别的差异越来越小。如果您需要任何实时通信,请尝试“推送器”,最后使用 PAAS。我推荐 APPFOG 或 CloudFoundry。它们是开源的 :) 谢谢@Casey。我的具体要求很简单,但有很多选择。我有一个将数据发送到服务器的硬件设备。然后,服务器必须根据需要向移动设备 (android/iphone/bb) 发送通知。设备还将向服务器发送命令,该命令将中继到硬件设备。该系统可能有数千个连接,并且必须非常灵敏。对于服务器,您是否建议我使用 php 来处理 http 请求?或者另有说明,鉴于我的要求,您认为实现服务器的最佳方法是什么? 对于实现服务器的语言,取决于您可用的开发人员和资源,PHP 可能有意义。 Ruby 也可以完成这项工作。如果您真的担心处理大量并发连接,nodeJS 是一种相对较新的技术,以“非阻塞”而闻名,这意味着它专门处理并发请求。根据您的移动应用程序与服务器之间通信的复杂程度,您也许可以使用双向短信进行通信,我推荐“twilio” 【参考方案1】:

我想说的是 HTTP 的简单性,至少在您的需求超出其功能之前是这样。 (您的应用程序需要的状态越多,HTTP 适配就越少)。

为了低成本和可扩展性,您可能不会错用 Rackspace 或 Amazon 之类的云。但我才刚刚开始,我的服务器一直是 tektonic 的 VPS。

【讨论】:

您能否详细说明一下“有状态”的含义?谢谢! en.wikipedia.org/wiki/Stateful。 HTTP 是一种无状态协议,尽管有许多技巧可以让它保持状态。 关于语言,由于各种原因我不喜欢 PHP,我自己更喜欢 Python,但如果你擅长 PHP,我认为没有理由不继续使用它。 嗯,机架空间看起来很有趣。谢谢你的提示。我假设基于 HTTP-POST 的通信设置会阻止我执行基于服务器事件的服务器推送到应用程序?应用程序必须查询服务器以获取更新? 我只想说我不知道​​如何使用 HTTP 从服务器推送到客户端。我不想说这是不可能的,因为几乎不可避免地,有人最终会证明这种断言是错误的。在我的日子里,我做了很多“不可能”的事情。

以上是关于用于移动客户端/服务器应用程序的基于套接字与 HTTP 的通信的主要内容,如果未能解决你的问题,请参考以下文章

Websocket 服务器和移动客户端

用于本地客户端-服务器通信的套接字与标准流

Azure 移动服务与将设备作为服务器的 Web 套接字

Azure 移动服务与将设备作为服务器的 Web 套接字

socket总结

将非 IOCP 客户端与 IOCP 服务器连接