【问题标题】:Server with different clients in QtQt 中具有不同客户端的服务器
【发布时间】:2012-11-26 13:40:07
【问题描述】:

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

  • 有一台服务器

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

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

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

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

【问题讨论】:

    标签: qt


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我已经使用两个独立的 QTcpServer 实例实现了该解决方案,并且效果非常好。现在我需要进行某种身份验证......但这是另一个问题。感谢您的精彩回答,这对我很有帮助。
    【解决方案2】:

    要识别客户,您必须使用某种客户 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 开发服务器更快、更容易。客户端可以以任何方式开发(C++ 与 Qt、Web 浏览器中的 Javascript 和许多其他方式)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多