1

我需要创建一个应用程序:

  • 拥有一台服务器

  • 使用连接到服务器并发送 8 个长数据的客户端(来自 8 个传感器的数据:雨、空气湿度、风速......) 1 个传感器数据/长数据(传感器数据从自定义 USB 设备获取)

  • 用户客户端。最终用户运行这种类型的客户端以连接到服务器以从传感器检索数据。

我以前用过 Qt,只用一种类型的客户端创建客户端-服务器应用程序。我也设法创建了这个应用程序,只是规模较小(使用了 5 个字,并且客户端同时连接到服务器)。我使用了 Qt 网络示例财富线程服务器和 http://goo.gl/srypT和阻塞财富客户端示例。

我如何识别哪个客户是哪个?(因为他们每次连接到互联网时都有不同的 ip)。在我的小规模应用程序中,我创建了某种协议,但必须有更有效的方法来做到这一点。

4

2 回答 2

1

我假设您想要识别客户端类型(“传感器客户端”与“用户客户端”),而不是单个客户端实例。

如问题中所述,执行此操作的直接方法是实现协议。对于您的用例,这可能非常简单:

  • 让“传感器客户端”发送一个“写入”命令(像“w”这样的字符就足够了),然后是您的传感器数据。然后服务器接收到“w”命令并知道他需要从客户端读取传感器数据。
  • 让“用户客户端”发送一个“读取”命令(例如字符“r”)。当服务器收到“r”命令时,它知道它需要向客户端发送数据。

如果出于某种原因,您甚至不想实现这样一个简单的协议,您还可以设置两个单独的 QTcpServer 实例,它们在不同的端口上侦听,比如说 8192 和 8193。然后您的“传感器客户端”将连接到端口 8192 ,并且服务器通过端口号知道客户端将发送数据。您的“用户客户端”将连接到端口 8193,并且服务器知道客户端需要数据并将发送所需的数据。

在任何情况下,您都应该知道不涉及身份验证和授权,任何知道简单协议和/或端口号的客户端都可以发送和接收数据。

于 2012-11-26T14:18:45.913 回答
0

要识别客户,您必须使用某种客户 ID。通常,某种散列(MD5 摘要、UUID 或 GUID)用作客户端 ID。当客户端连接到服务器时,这个客户端 ID 必须从客户端发送到服务器。

客户端被识别和接受后会发生什么,取决于连接的类型(协议)。如果您使用有状态协议,只要客户端使用它,相同的连接就会保持打开状态,因此无需重新识别客户端。如果使用无状态连接(例如 HTTP),每次客户端需要数据(即:文档、页面等)到服务器。

处理这样的客户端/服务器架构的一种更简单、更有效的方法是使用现有的、经过验证的某种服务器。例如,您可以使用 Wt (http://www.webtoolkit.eu/wt/blog) 之类的 RESTful Web 服务器,前提是您已经在使用 C++。

更好的是,我会使用基于 Ruby 或 Python 的 RESTful Web 服务框架,例如:

http://www.sinatrarb.com/

http://bottlepy.org/docs/dev/

http://flask.pocoo.org/

或者新的 Ruby-on-Rails API:

http://blog.steveklabnik.com/posts/2012-11-22-introducing-the-rails-api-project

https://github.com/rails-api/rails-api

用 Ruby 或 Python 开发服务器更快、更容易。客户端可以以任何方式开发(使用 Qt 的 C++、Web 浏览器中的 Javascript 和许多其他方式)

于 2012-11-26T14:20:47.387 回答